【问题标题】:Any nice record Handling tricks in Haskell?Haskell 中有什么不错的记录处理技巧吗?
【发布时间】:2012-01-23 15:26:17
【问题描述】:

我知道记录的部分更新如下:

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}的通用反序列化机制?我不建议实际以 Haskell Show 格式存储任何数据;它根本不会紧凑,用 Haskell 以外的任何东西解析它都会很痛苦。

标签: haskell syntax record


【解决方案1】:

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

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

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

【讨论】:

  • 啊,我只是没有通过当你制作一个时发生的警告和显示抛出的异常。是的,safecopy 看起来很有趣,谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多