习惯修改成员变量的方法

时间:2011-06-02 13:56:26

标签: haskell

我知道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个或更多成员的数据类型。当我需要修改单个成员时,会产生非常冗长的代码。有办法解决这个问题吗?

2 个答案:

答案 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 ....