我知道Haskell不是OO所以它不是严格意义上的'成员变量'。
data Foo = Foo {
bar :: Int,
moo :: Int,
meh :: Int,
yup :: Int
}
modifyBar (Foo b m me y) = (Foo b' m me y)
where b' = 2
这就是我的代码目前的样子。问题是我现在正在制作16个或更多成员的数据类型。当我需要修改单个成员时,会产生非常冗长的代码。有办法解决这个问题吗?
答案 0 :(得分:11)
modifyBar foo = foo { bar = 2 }
此语法将复制foo
,然后将该副本的bar
字段修改为2.这可以自然地扩展到更多字段,因此您无需编写{{1完全没有功能。
(见http://book.realworldhaskell.org/read/code-case-study-parsing-a-binary-data-format.html#id625467)
答案 1 :(得分:5)
Haskell的“记录语法”是@KennyTM显示的内置方式,但请记住,它仍然只是一种基于旧值构建新值的方法。
但是,记录语法有一些恼人的限制,特别是用于“修改”记录中单个项目的表单不是该语言中的第一类实体,因此您无法对它们进行抽象并通过他们就像你使用常规功能一样。
另一种方法是使用提供类似功能的a library such as fclabels
,使用Template Haskell自动生成访问器函数而不是内置语法。结果往往更好,但缺点是你现在依赖于TH ....