Haskell记录语法令人厌恶

Mar*_*urg 6 haskell

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

data PairRecord = PR {foo::Int, bar::String} deriving (Eq,Show)
x = (PR {foo=1, bar="init"})
y= x {foo=23}
Run Code Online (Sandbox Code Playgroud)
  • 什么这种{foo=23}事吗?最后一行看起来好像是函数x的参数,显然不是这种情况.
  • {foo=23}除了把它放在唱片后面之外,我还能做些什么吗?
  • 有没有一种正式的方式来解决它,就像我们用do符号做的那样?

kos*_*kus 10

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

case x of
  PR f b -> PR 23 b
  _      -> error "Update error"
Run Code Online (Sandbox Code Playgroud)

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