我知道对以下记录进行部分更新:
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类似的选项存在。
答案 0 :(得分:5)
部分初始化工作正常:A {a=1}
是A Int ()
类型的有效表达式; Read
实例只是不解析Show
实例不输出的任何内容。 b
字段初始化为error "..."
,其中字符串包含文件/行信息以帮助调试。
您通常不应该将Read
用于任何真实的解析情况;它适用于那些具有非常简单的序列化需求和调试的玩具程序。
我不确定“subrecord”是什么意思,但是如果你想要序列化/反序列化可以应对记录格式的“升级”以包含更多信息,同时仍然能够处理旧的(现在“部分”) )序列化,然后safecopy库就是这样。
答案 1 :(得分:0)
你不能在Haskell中保留一些“未初始化”的值(无论如何都不可能“初始化”它,因为Haskell是纯粹的)。如果要为字段提供“默认”值,则可以为记录类型创建一些“默认”值,然后对该默认值进行部分更新,仅设置您关注的字段。但是,我不知道如何以简单的方式为此实现read
。