繁体   English   中英

Haskell记录语法令人厌恶

[英]Haskell record syntax desugared

我理解如何在Haskell中使用记录语法,但是我很难理解花括号里面的东西是什么

data PairRecord = PR {foo::Int, bar::String} deriving (Eq,Show)
x = (PR {foo=1, bar="init"})
y= x {foo=23}
  • 什么{foo=23}的事情吗? 最后一行看起来好像是函数x的一个参数,显然不是这种情况。
  • 除了把它放在记录后面之外,我还能用{foo=23}做些什么吗?
  • 有没有desugar它像什么,我们可以做一个正式的方式do记号?

此语法称为“记录更新”或“使用字段标签更新”,并在Haskell 2010报告的第3.15.3节中进行了描述。 它可以被贬低。 报告中给出了确切的规则。 在你的例子中, x {foo = 23}的消亡是

case x of
  PR f b -> PR 23 b
  _      -> error "Update error"

请注意,报告使用了一个名为“pick”的辅助函数,该函数在3.15.2之前的“使用字段标签构造”一节中描述。

你需要的是所谓的镜头 但首先你必须安装包装镜头。

通过查看类型:

:t PR
PR :: Int -> String -> PairRecord

所以这意味着你需要一个Int和一个String来构造一个PairRecord。

现在,在PairRecord的定义中,您已经定义了访问者:

:t foo
foo :: PairRecord -> Int

为了使用foo(作为访问者),你需要提供一个PairRecord。 你得到一个Int作为返回值:

foo y
23

这意味着foo单独没有任何意义,这个函数需要一个PairRecord。

正如kosmikus已经指出的那样,语法

y= x {foo=23}

从现有的PairRecord创建y,其整数设置为23(在访问器函数的帮助下)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM