5

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 は参照もポインターも使用せず、データをそのまま表示するため、これがどのように保存されるかはわかりません。私は、この素朴な非難が無限のバイトストリングにつながるという強い兆候を持っています...

では、この型を安全に保存するにはどうすればよいでしょうか。

4

1 に答える 1

6

データにサイクルがない場合は問題ありません。しかし、サイクルのように

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

確かに無限の結果を生成しようとしています。これを回避する唯一の方法は、すべてのノードに一意のラベルを付け、それらを使用してバイナリに変換する際のサイクルを回避することです。

于 2011-06-26T12:38:54.227 に答える