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

Lan*_*nbo 5 binary haskell recursive-datastructures bytestring

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
Run Code Online (Sandbox Code Playgroud)

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

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

aug*_*tss 6

如果你的数据没有周期,那你就没事了.但是一个循环,就像

r = Ref "a" [("b", r)]
Run Code Online (Sandbox Code Playgroud)

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

  • 我的意思是每个节点必须有一些唯一的名称.也许refName是唯一的?然后,当您输出一个节点时,您会记住它的名称,因此如果您尝试再次输出该节点,则会输出(返回)它的引用.它涉及更多,但处理周期是必要的. (2认同)