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作为一种语言既不使用引用也不使用指针,而是按原样呈现数据,我不确定如何保存它。我有强烈的迹象表明,这种天真的责备将导致无限的字节串......
那么如何安全地保存这种类型?
答案 0 :(得分:6)
如果你的数据没有周期,那你就没事了。但是一个循环,比如
r = Ref "a" [("b", r)]
确实会产生无限的结果。解决这个问题的唯一方法是为所有节点提供唯一标签,并在转换为二进制文件时使用这些标签来避免循环。