Haskell记录语法令人厌恶

时间:2014-02-12 10:49:58

标签: haskell

我理解如何在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}做的任何事情,除非把它放在后面 一个记录?
  • 有没有一种正式的方法来解决它,就像我们用do符号做的那样?

3 个答案:

答案 0 :(得分:10)

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

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

请注意,报告在section before, 3.15.2, on "Construction using field labels"中描述的desugaring中使用了一个名为“pick”的辅助函数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

通过查看类型:

: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(在访问器函数的帮助下)。