haskell - 如何使用 Data.Binary 存储递归数据类型

标签 haskell binary bytestring recursive-datastructures

Data.Binary是很棒的。我只有一个问题。假设我有这样的数据类型:

import Data.Binary

data Ref = Ref {
    refName :: String,
    refRefs :: [(String, Ref)]
}

instance Binary Ref where
    put a = put (refName a) >> put (refRefs a)
    get = liftM2 Ref get get

很容易看出这是一种递归数据类型,它之所以有效是因为 Haskell 是惰性的。由于 Haskell 作为一种语言既不使用引用也不使用指针,而是按原样呈现数据,我不确定如何保存它。我有强烈的迹象表明这种幼稚的指责将导致无限的字节串......

那么如何才能安全地保存这种类型呢?

最佳答案

如果您的数据没有周期,您会没事的。但是一个循环,比如

r = Ref "a" [("b", r)]

确实会产生无限的结果。解决此问题的唯一方法是为所有节点提供唯一标签,并在转换为二进制时使用这些标签来避免循环。

关于haskell - 如何使用 Data.Binary 存储递归数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6483600/

相关文章:

haskell - 将字节串流式传输为 WAI HTTP 服务器响应正文

haskell - String -> ByteString 并反转

haskell - Haskell 中的语句排序?

haskell - 流包的Stream数据类型是否等同于FreeT?

exception - 这是有效的 x86 汇编指令吗?

java - 将字符串的一部分转换为 int 以从二进制转换为浮点 JAVA 的最佳方法

haskell - 制作更好的 Haskell 函数

haskell - 为什么 Identity monad 有用?

javascript - 如何通过 Javascript 中的一元运算符将数字转换为字符串?

haskell - 将 ByteString 漂亮地打印为十六进制半字节