任何好的记录在Haskell处理技巧?

时间:2012-01-23 15:26:18

标签: haskell syntax record

我知道对以下记录进行部分更新:

data A a b = A { a :: a, b :: b }
x = A { a=1,b=2 :: Int }
y = x { b = toRational (a x) + 4.5 }

是否有任何技巧只能进行部分初始化,创建子记录类型或在子记录上进行(反)序列化?

特别是,我发现这些行中的第一行有效,但第二行没有:

read "A {a=1,b=()}" :: A Int ()
read "A {a=1}" :: A Int ()

你总是可以使用正则表达式按下这样的输入,但我很好奇Haskell类似的选项存在。

2 个答案:

答案 0 :(得分:5)

部分初始化工作正常:A {a=1}A Int ()类型的有效表达式; Read实例只是不解析Show实例不输出的任何内容。 b字段初始化为error "...",其中字符串包含文件/行信息以帮助调试。

您通常不应该将Read用于任何真实的解析情况;它适用于那些具有非常简单的序列化需求和调试的玩具程序。

我不确定“subrecord”是什么意思,但是如果你想要序列化/反序列化可以应对记录格式的“升级”以包含更多信息,同时仍然能够处理旧的(现在“部分”) )序列化,然后safecopy库就是这样。

答案 1 :(得分:0)

你不能在Haskell中保留一些“未初始化”的值(无论如何都不可能“初始化”它,因为Haskell是纯粹的)。如果要为字段提供“默认”值,则可以为记录类型创建一些“默认”值,然后对该默认值进行部分更新,仅设置您关注的字段。但是,我不知道如何以简单的方式为此实现read