记录-输出-预处理器
几乎在每种编程语言中a.b公司
将获得b条
来自的字段一
数据类型,许多不同的数据类型可以有b条
字段。此功能之所以普遍存在,是因为它有用的. The记录-输出-预处理器
将此功能引入现代GHC版本。此功能已经为Haskell提议作为记录点语法
自GHC 9.2以来重载RecordDot
和过载的记录更新
扩展实现了大致相同的功能。一些示例:
data Company=公司{name::String,所有者::Person}data Person=Person{name::String,age::Int}显示::公司->字符串显示c=c.name++“由”++c.owner.name运行nameAfterOwner::公司->公司nameAfterOwner c=c{name=c.owner.name++“的公司”}
这里我们声明两条记录名称
作为字段,然后写入c.名称
和c.所有者名称
获取这些字段。我们也可以写c{name=x}
作为记录更新,即使名称
不再是唯一的。
我该如何使用这个魔法?
第一次安装记录-输出-预处理器
无论是哪一种堆栈安装record-dot-preprocessor
或cabal更新和cabal安装record-dot-preprocessor
。然后在文件顶部添加:
- 要么:
{-#OPTIONS_GHC-F-pgmF=记录dot-预处理器#-}
用于预处理器。
- 或者:
{-#OPTIONS_GHC-fplugin=记录点预处理器#-}
和{-#LANGUAGE DuplicateRecordFields、TypeApplications、FlexibleContexts、DataKinds、MultiParamTypeClasses、TypeSynonymInstances、FlexibleInstance、UndecitableInstances和GADTs#-}
用于GHC插件。
GHC插件仅在GHC 8.6或更高版本上运行,在Windows上有一些问题并且有更好的错误消息。相比之下,预处理器无处不在,并且具有更多功能。
你必须确保选项_GHC
同时应用于文件定义记录的位置、和使用记录语法的位置。生成的程序将需要记录-哈斯菲尔德
图书馆.
确切地说,有什么魔法可用?
使用预处理器或GHC插件,您可以编写:
expr.lbl(表达.lbl)
等于getField@“lbl”表达式
(该.
两边不能有空格)。
表达式{lbl=val}
等于setField@“lbl”expr值
(该{
前面不能有空格)。
(磅)
等于(\x->x.lbl)
(该.
后面不能有空格)。
使用预处理器,但不GHC插件:
表达式{lbl1.lbl2=val}
等于expr{lbl1=(expr.lbl1){lbl2=val}}
,执行嵌套更新。
表达式{lbl*val}
等于expr{lbl=expr.lbl*val}
,其中*
可以是任何运算符。
表达式{lbl1.lbl2}
等于表达式{lbl1.lbl2=lbl2}
.
这些表格结合起来提供了身份:
表达式lbl.lbl2
等于(表达lbl1)lbl2
.
(.lbl1.lbl2)
等于(\x->x.lbl1.lbl2)
.
表达式lbl1{lbl2=val}
等于(表达式lbl1){lbl2=val}
.
表达式{lbl1=val}.lbl2
等于(表达式{lbl1=val}).lbl2
.
表达式{lbl1.lbl2*val}
等于expr{lbl1.lbl2=expr.lbl.lbl2*val}
.
表达式{lbl1=val1,lbl2=val2}
等于(表达式{lbl1=val1}){lbl2=val2}
.
这个魔法和其他魔法相比怎么样?
哈斯克尔的记录是众所周知的相当糟糕。有许多建议目的是利用从类型系统和范畴理论中提取的黑暗艺术,使哈斯克尔的记录更加强大。这个预处理器的目的是简化——将现有元素组合成连贯的故事。其目的是做到不比Java差,而不是达到完美。
使用这个魔法有什么建议吗?
最重要的考虑是a.b公司
或a{b=c}
语法必须有哈斯菲尔德
实例,这需要在定义它们的模块上运行预处理器/插件,或者手动编写孤立实例。要使用没有此类实例的记录,请使用正常的选择器功能(例如。b和a
)并在{
(例如。a{b=c}
).
限制
- 预处理器不处理内部的反引号表达式
拟引号
,例如。[D.pgSQL|$SECT${dumm.x}::text|]
.