formatting-7.1.1:基于组合器的类型安全格式(如printf()或FORMAT)
版权(c) 2020年亚历克斯·查普曼
许可证英国标准D3
维护人员alex@farfromthere.net
稳定性实验的
便携性GHC公司
安全哈斯克尔
语言哈斯克尔2010

格式化。选择符

描述

格式化组合符接受Format并返回另一个Format。通常,我们希望更改原始格式作为其*输入*的内容,留下多态的输出。这些组合子中的许多可以链接在一起形成单个格式.

实现细节:为了能够将多个组合子链成一个格式我们需要它们都使用相同的中间字符串类型,并且我们选择了建设者.这并不意味着你必须使用建设者s、 因为最终的输出字符串类型第页仍然是多态的。|

简介

格式化通用容器

五月床 来源 #

论据

::建设者

输入为Nothing时要使用的值

->格式 建设者(a->建设者)

要对Just中的值使用的格式化程序

->格式第页(也许 吧a->r) 

将Maybe值呈现为默认值(如果为Nothing)或使用给定的格式化程序:

>>>格式(可能是“再见”文本)没有“再见”
>>>格式(可能是“再见”文本)(只是“你好”)“你好”

有选择权的::格式 建设者(a->建设者) ->格式第页(也许 吧a->r)来源 #

使用给定的格式化程序在Maybe中呈现值,或生成空字符串:

>>>格式(可选文本)无""
>>>格式(可选文本)(仅“Hello”)“你好”

在这里 来源 #

论据

::格式 建设者(a->建设者)

要对Left中的值使用的格式化程序

->格式 建设者(b->建设者)

要对Right中的值使用的格式化程序

->格式第页(要么a b->r) 

在“二者之一”中渲染值:

>>>format(eithered text int)(左“错误!”“错误!”
>>>格式(eithered text int)(右69)"69"

左撇子::格式 建设者(a->建设者) ->格式第页(要么a x->r)来源 #

使用给定的格式化程序在Left中呈现值,将Right呈现为空字符串:

>>>格式(左文本)(左“bingo”)“宾果”
>>>格式(左文本)(右16)""

扶正的::格式 建设者(a->建设者) ->格式第页(要么x a->r)来源 #

使用给定的格式化程序呈现Right中的值,将Left呈现为空字符串:

>>>格式(右侧文本)(左侧16)""
>>>格式(右文本)(右“宾果”)“宾果”

格式化数据列表

串联的::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

设置列表中每个值的格式并将其全部串联:

>>>格式(连接文本)[“一”、“二”、“三”]“一二三”
>>>格式(取15(串联箱))[1..]"1101110010111011110001001101010111100110111101111"

加入::可折叠的t=>([文本] ->文本) ->格式 建设者(a->建设者) ->格式r(t a->r)来源 #

使用给定的text-join函数将列表中单独呈现的项连接在一起。

>>>格式(joinedWith(mconcat.revese)int)[123456789]"789456123"

插层的::可折叠的t=>文本->格式 建设者(a->建设者) ->格式r(t a->r)来源 #

设置列表中每个值的格式,并将给定字符串置于每个值之间:

>>>fprintLn(插入“||”int)[1,2,3]1||2||3

未装备的::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

用空格设置列表中每个值的格式:

>>>格式(unworded int)[1,2,3]"1 2 3"

无衬里的::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

设置列表中每个值的格式,并将每个值放在自己的行上:

>>>fprint(无衬字符)b条c(c)

间隔::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

用空格分隔折叠式(例如列表)的格式化项目:

>>>格式(以int分隔)[1,2,3]"1 2 3"

请注意,此行为与未装备的,这只是一种不同的思考方式。

逗号步骤::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

用逗号分隔可折叠(例如列表)的格式化项目:

>>>格式(commaSep stext)[“一”、“二”、“三”、“四”、“五”]“一、二、三、四、五”
>>>格式(采用5(逗号步int))[1..]"1,2,3,4,5"

逗号空间Sep::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

用逗号和空格分隔折叠式(例如列表)的格式化项目:

>>>格式(占用3个(commaSpaceSep单词))[1..]“第一、第二、第三”

列表::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

在可折叠项周围添加方括号(例如列表),并用逗号和空格分隔每个格式化项。

>>>格式(list-stext)[“一”、“二”、“三”]“[一,二,三]”
>>>格式(显示列表)[“一”、“二”、“三”]“[”一“,”二“,”三“]”

qlist(qlist)::可折叠的t=>格式 建设者(a->建设者) ->格式r(t a->r)来源 #

喜欢列表,但还要在每个渲染项周围加上双引号:

>>>fprintLn(qlist-stext)[“一”,“二”,“三”][“一”、“二”、“三”]

::国际->格式r([a]->r)->格式r([a]->r)来源 #

只取项目列表中的前n个项目。

>>>格式(取7(列表箱))[1..]"[1, 10, 11, 100, 101, 110, 111]"
>>>格式(列出箱子)(取7[1..])"[1, 10, 11, 100, 101, 110, 111]"

下降::国际->格式r([a]->r)->格式r([a]->r)来源 #

从项目列表中删除前n个项目。

>>>格式(删除了3(list int)[1..6]"[4, 5, 6]"

拆分要传递给其他格式化程序的字符串

溅射 来源 #

论据

:: (烧焦->布尔)

是否在此字符处拆分字符串

-> (格式r’(建设者->r')->格式 建设者([建设者] ->建设者))

列表形成组合符,例如。未装备的,列表,串联的等。

->格式注册会计师

基本格式化程序,其呈现的文本将被拆分

->格式注册会计师 

将格式化项拆分到给定谓词匹配的位置,并使用给定的列表组合符呈现字符串的结果列表(这个函数是从一个平行的宇宙发送给我们的,在这个宇宙中splat是split的过去分词,例如“哎哟,我的裤子被splat了”)。

>>>format(splat Data.Char.isSpace commaSpaceSep stext)“此\t格式不正确”“此,,是,,格式很差,,”

splotWith(使用) 来源 #

论据

:: (文本-> [文本])

文本拆分器

-> (格式r’(建设者->r')->格式 建设者([建设者] ->建设者))

列表形成组合符,例如。未装备的,列表,串联的等。

->格式注册会计师

基本格式化程序,其呈现的文本将被拆分

->格式注册会计师 

用于获取文本分割函数并将其转换为格式组合符的实用程序。

>>>格式(splatWith(TL.chunksOf 3)list int)1234567890"[123, 456, 789, 0]"

splatOn(打开) 来源 #

论据

::文本

要拆分的文本

-> (格式r’(建设者->r')->格式 建设者([建设者] ->建设者))

列表形成组合符,例如。未装备的,列表,串联的等。

->格式注册会计师

基本格式化程序,其呈现的文本将被拆分

->格式注册会计师 

在给定字符串的实例处拆分格式化项,并使用给定的列表组合符呈现字符串的结果列表。

>>>fprint(splotOn“,”无衬里文本)“一,二,三”
>>>fprint(splatOn“,”indentedLines文本)“一,二,三”

措辞的 来源 #

论据

:: (格式r’(建设者->r')->格式 建设者([建设者] ->建设者))

列表形成组合符,例如。未装备的,列表,串联的等。

->格式注册会计师

基本格式化程序,其呈现的文本将被拆分

->格式注册会计师 

将格式化项拆分为单词,并使用给定的列表组合符呈现字符串的结果列表。

>>>格式(文字列表文本)“一二三”“[一,二,三]”

有内衬的 来源 #

论据

:: (格式 建设者(建设者->建设者) ->格式 建设者([建设者] ->建设者))

列表形成组合符,例如。未装备的,列表,串联的等。

->格式注册会计师

基本格式化程序,其呈现的文本将被拆分

->格式注册会计师 

将格式化项拆分为多行,并使用给定的列表组合符呈现字符串的结果列表。

>>>fprintLn(lined qlist text)“one two three \n\nforour five 6\nseven捌玖\n\n”[“一二三”,“”,“四五六”,“七八九”,“]

改变格式化字符串

更改为:: (文本->文本) ->格式r a->格式注册会计师来源 #

使用给定函数更改格式化字符串。

>>>格式(使用Data.Text.Lazy.reverse int更改)123456"654321"

字符保留If:: (烧焦->布尔) ->格式r a->格式注册会计师来源 #

筛选格式化字符串,使其仅包含传递给定谓词的字符:

>>>格式(charsKeptIf Data.Char.isUpper文本)“Data.Char.isUpper”“DCU”

删除的字符If:: (烧焦->布尔) ->格式r a->格式注册会计师来源 #

筛选格式化字符串,使其不包含传递给定谓词的字符:

>>>格式(charsRemovedIf Data.Char.isUpper文本)“Data.Char.isUpper”“ata.har.isper”

替换::文本->文本->格式r a->格式注册会计师来源 #

取一个格式化程序,将给定的针替换为其输出中的给定替换。

>>>format(替换为“Bruce”“<redacted>”stext)“布鲁斯回答说,布鲁斯的名字实际上是‘<redacted>’。”“<redacted>回答说,<redacted>的名字实际上是‘<redactd>’。”

大写的::格式r a->格式注册会计师来源 #

将给定格式化程序输出中的任何字母转换为大写字母。

>>>格式(大写文本)“我不是在喊,你是在喊。”“我不是在开枪,你是在开枪。”

下层的::格式r a->格式注册会计师来源 #

将给定格式化程序输出中的任何字母转换为小写。

>>>格式(小写文本)“Cd SrC/;Rm-Rf*”“cd src/;rm-rf*”

有标题的::格式r a->格式注册会计师来源 #

将格式化字符串转换为标题大小写或类似的内容:

>>>格式(以标题为基础的字符串)“布莱恩的一生”《布莱恩的一生》

超短的::国际64->格式r a->格式注册会计师来源 #

在末尾截断格式化字符串,使其长度不超过给定的字符数,并在末尾放置省略号,使其不超过此长度。

>>>格式(截断5个文本)“hello”“你好”
>>>格式(截断5个文本)“您好”“他……”

带ctruncated的::国际64->国际64->格式r a->格式注册会计师来源 #

截断中间的格式化字符串,在开始和结束处保留给定数量的字符,并在其间放置省略号。长度不得超过`start+end+3`个字符。

>>>format(ctruncated 15 4 text)“敏捷的棕色狐狸跳过了懒狗。”“那只敏捷的棕色……狗。”
>>>格式(ctruncated 15 4 text)“The quick brown fox”“敏捷的棕色狐狸”

rtruncated(已运行)::国际64->格式r a->格式注册会计师来源 #

在开头截断格式化字符串,使其长度不超过给定的字符数,在开头放置省略号,使其不超过此长度。

>>>格式(rtrunated 5文本)“hello”“你好”
>>>格式(rtrunated 5文本)“您好”“…os”

添加了lp::国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

用给定字符填充左侧的格式化字符串,使其具有给定的最小宽度:

>>>格式(lpaded 7''int)1"      1"
>>>格式(lpadded 7''int)123456789"123456789"

rp已添加::国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

用给定字符填充右侧的格式化字符串,使其具有给定的最小宽度:

>>>格式(rpadded 7''int)1"1      "

cpadded(已添加)::国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

用给定字符填充左右两侧的格式化字符串,使其居中,并使其具有给定的最小宽度:

>>>格式(cpadded 7''int)1"   1   "

lfixed公司::国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

使用固定宽度设置项目的格式,在左侧填充给定字符以扩展,在右侧添加省略号以缩短:

>>>格式(lfixed 10''int)123"123       "
>>>格式(lfix 10英寸int)1234567890"1234567890"
>>>格式(lfix 10英寸int)123456789012345"1234567..."

固定的::国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

将项目设置为固定宽度,在右侧填充给定字符以扩展,在右侧添加省略号以缩短:

>>>格式(rfixed 10''int)123"       123"
>>>格式(rfixed 10''int)1234567890"1234567890"
>>>格式(rfixed 10''int)123456789012345"...9012345"

cfixed(固定)::国际64->国际64->烧焦->格式r(a->r)->格式r(a->r)来源 #

使用固定宽度设置项目的格式,两边填充给定字符以扩展,中间添加省略号以缩短。

总长度为`l+r+3`个字符。

>>>格式(cfixed 4 3''int)123"    123   "
>>>格式(cfixed 4 3''int)1234567890"1234567890"
>>>格式(固定4 3英寸int)123456789012345"1234...345"

换行格式化字符串

加了前缀::建设者->格式r a->格式注册会计师来源 #

将给定前缀添加到格式化项目:

>>>format(“答案是:”%前缀“wait for it…”int)42“答案是:等待……42”
>>>fprint(无衬里(缩进4(前缀为“-”int))[1,2,3]- 1- 2- 3

后缀::建设者->格式r a->格式注册会计师来源 #

将给定的后缀添加到格式化项目中。

包围::建设者->格式r a->格式注册会计师来源 #

用给定字符串包围输出字符串:

>>>格式(环绕“***”字符串)“glue”“***胶水***”

随函附上的::建设者->建设者->格式r a->格式注册会计师来源 #

用给定字符串括起输出字符串:

>>>format(包含“<!--”“-->”文本)“html注释”“<!--html注释-->”

方形的::格式r a->格式注册会计师来源 #

在格式化项目周围添加单引号:

>>>let obj=格式中的Just Nothing(“对象是:”%squoted shown%“。”)obj“目标是:‘什么都没有’。”

d引用::格式r a->格式注册会计师来源 #

在格式化项目周围添加双引号:

>>>fprintLn(“他说这是基于”%dquoted-stext%“)“科学”他说这是基于“科学”。

带括号的::格式r a->格式注册会计师来源 #

在格式化项目周围添加括号:

>>>格式(“我们发现”%括号int%“不符。”)17“我们发现(17)处差异。”
>>>fprintLn(取5(列表(括号内的int))[1..][(1), (2), (3), (4), (5)]

平方的::格式r a->格式注册会计师来源 #

在格式化项目周围添加方括号:

>>>格式(平方整数)7"[7]"

有支撑的::格式r a->格式注册会计师来源 #

在格式化项目周围添加花括号:

>>>格式化(“\\begin”%括号文本)“节”“\\开始{节}”

有角度的::格式r a->格式注册会计师来源 #

在格式化项目周围添加尖括号:

>>>格式(带角度的int)7"<7>"
>>>格式(列表(倾斜文本))[“html”,“head”,“title”,“body”,“div”,“span”]“[<html>,<head>,<title>,<body>,<div>,<span>]”

反勾选的::格式r a->格式注册会计师来源 #

在格式化项目周围添加反勾号:

>>>format(“确保以root身份运行”%backticked-builder%“)“:(){:|:&};:”“请确保以root身份运行`:(){:|:&};:`。”

更改缩进

缩进的::国际->格式r a->格式注册会计师来源 #

在渲染文本的开头插入给定数量的空格:

>>>格式(缩进4 int)7"    7"

注意,这只缩进多行字符串的第一行。要缩进所有行,请参见重新凹陷.

缩进线条::可折叠的t=>国际->格式 建设者(a->建设者) ->格式r(t a->r)来源 #

设置项目列表的格式,每行放置一个,按给定的空格数缩进。

>>>fprintLn(“幸运数字是:\n”%indentedLines 4 int)[7,13,1,42]幸运数字是:713142

重新凹陷::国际->格式r a->格式注册会计师来源 #

按给定的空格数缩进格式化字符串的每一行:

>>>fprint(重新缩进的2个文本)“一棵树”

数字适配器

舍入到:: (完整的我,RealFrac公司日期:,Functor函数f) =>f(i->r)->f(d->r)来源 #

取一个分数并四舍五入,然后将其格式化为给定格式:

>>>格式(四舍五入到整数)6.66"7">>>format(list(roundedTo int))[10.66、6.66、1.0、3.4]"[11, 7, 1, 3]"

注意:类型变量(f)几乎总是“格式r”,因此可以将此函数的类型视为:

roundedTo::(积分i,RealFrac d)=>格式r(i->r)->格式r(d->r)

截断到:: (完整的我,RealFrac公司日期:,Functor函数f) =>f(i->r)->f(d->r)来源 #

取一个分数并将其截断,然后将其格式化为给定格式:

>>>格式(truncatedTo int)6.66"6">>>格式(list(truncatedTo int))[10.66、6.66、1.0、3.4]"[10, 6, 1, 3]"

注意:类型变量(f)几乎总是“格式r”,因此可以将此函数的类型视为:

truncatedTo::(整数i,RealFrac d)=>格式r(i->r)->格式r(d->r)

天花板收件人:: (完整的我,RealFrac公司日期:,Functor函数f) =>f(i->r)->f(d->r)来源 #

取一个分数并将其设为上限,然后将其格式化为给定格式:

>>>格式(ceilingedTo int)6.66"7">>>格式(list(ceilingedTo int))[10.66、6.66、1.0、3.4]"[11, 7, 1, 4]"

注意:类型变量(f)几乎总是“格式r”,因此可以将此函数的类型视为:

ceilingedTo::(积分i,RealFrac d)=>格式r(i->r)->格式r(d->r)

地板至:: (完整的我,RealFrac公司日期:,Functor函数f) =>f(i->r)->f(d->r)来源 #

取一个分数,在将其格式化为给定格式之前将其设置底数:

>>>格式(flooredTo int)6.66"6">>>格式(list(flooredTo int))[10.66、6.66、1.0、3.4]"[10, 6, 1, 3]"

注意:类型变量(f)几乎总是“格式r”,因此可以将此函数的类型视为:

flooredTo::(积分i,RealFrac d)=>格式r(i->r)->格式r(d->r)

结构格式设置

已查看::((a->)施工a b)->s->施工a)->格式r(a->r)->格式r(s->r)来源 #

使用给定的镜头查看项目,并使用给定的格式化程序对其进行格式化。

您可以将其视为具有以下类型:

已查看::透镜's a->格式r(a->r)->格式r(s->r)
>>>格式(查看_1int)(1,“hello”)"1"

当与Format的Monoid实例结合使用时,这很有用,因为它允许我们仅将数据结构作为参数给出一次,并使用格式化程序对其进行解构:

data Person=个人{_personName::文本,personAge::Int(_P)}makeLenses“人”我::个人me=人亚历克斯38format(“此人的名字是”%squoted(viewed personName text)%“,他们的年龄是”<>viewed person age int)me“此人的姓名是亚历克斯,他们的年龄是38“

已访问::(s->a)->格式r(a->r)->格式r(s->r)来源 #

访问结构的元素并使用给定的格式化程序对其进行格式化。

>>>format(访问的fst-int)(1,“hello”)"1"

重复以下示例已查看:

format(“此人的名字是”%squoted(accessed_personName text)%“,他们的年龄是”<>accessed_personAge int)me“此人的姓名是亚历克斯,他们的年龄是38“

固定宽度数字格式

bin前缀::完整的a=>国际64->格式r(a->r)来源 #

使用带前导0b的二进制表示法呈现整数,并用零填充到给定宽度:

>>>格式(binPrefix 16)4097“0b00010000000000001”

octPrefix(八位前缀)::完整的a=>国际64->格式r(a->r)来源 #

使用带前导0o的八进制表示法呈现整数,并用零填充到给定宽度:

>>>格式(octPrefix 16)4097“0o0000000000010001”

十六进制前缀::完整的a=>国际64->格式r(a->r)来源 #

使用带前导0x的八进制表示法呈现整数,并用零填充到给定宽度:

>>>格式(十六进制前缀16)4097“0x0000000000001”