Как сохранить рекурсивный тип данных с помощью Data.Binary - PullRequest
5 голосов
/ 26 июня 2011

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 не использует ни ссылок, ни указателей, а представляет данные как есть, я не уверен, как они будут сохранены.У меня есть четкое указание на то, что этот наивный упрек приведет к бесконечной проверочной строке ...

Так как же можно безопасно сохранить этот тип?

1 Ответ

6 голосов
/ 26 июня 2011

Если ваши данные не имеют циклов, все будет в порядке.Но цикл, подобный

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

, действительно приведет к бесконечному результату.Единственный способ обойти это - предоставить уникальные метки всем узлам и использовать их, чтобы избежать циклов при преобразовании в двоичный файл.

...