haskell - Haskell 中有什么好的记录处理技巧吗?

标签 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 的选项。

最佳答案

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

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

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

关于haskell - Haskell 中有什么好的记录处理技巧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974030/

相关文章:

Haskell:可以递归调用 main 吗?

c# - C# 中的 if/else 语句

syntax - 如何更新模型内的字段/值?

Haskell 'let' 实现

haskell - 将 literate Haskell (.lhs) 转换为 Haskell (.hs)

haskell - fromIntegral 是如何工作的?

ruby - 使用 %w[] 创建空字符串数组

c - 如何使用 printf 格式化 unsigned long long int?

mysql - 更新 SQL 中的完整记录?

java - Java如何从第一行开始向mysql表的特定字段插入数据