我理解如何在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
符号做的那样?答案 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(在访问器函数的帮助下)。