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

Jef*_*ges 3 syntax haskell 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 }
Run Code Online (Sandbox Code Playgroud)

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

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

read "A {a=1,b=()}" :: A Int ()
read "A {a=1}" :: A Int ()
Run Code Online (Sandbox Code Playgroud)

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

ehi*_*ird 5

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

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

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