我知道像这样的记录的部分更新:
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 的选项。
最佳答案
部分初始化工作正常:A {a=1}
是 A Int ()
类型的有效表达式; Read
实例不会解析任何 Show
实例不输出的内容。 b
字段初始化为 error "..."
,其中字符串包含有助于调试的文件/行信息。
对于任何真实世界的解析情况,您通常不应该使用 Read
;它适用于具有非常简单的序列化需求和调试的玩具程序。
我不确定你所说的“子记录”是什么意思,但是如果你想要序列化/反序列化可以应对记录格式的“升级”以包含更多信息,同时仍然能够处理旧的(现在是“部分” ) 序列化,然后是 safecopy图书馆就是这样做的。
关于haskell - Haskell 中有什么好的记录处理技巧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974030/