Я пытаюсь сохранить простую (но довольно большую) древовидную структуру в двоичный файл, используя Haskell. Структура выглядит примерно так:
-- For simplicity assume each Node has only 4 childs
data Tree = Node [Tree] | Leaf [Int]
А вот как мне нужно, чтобы данные выглядели на диске:
- Каждый узел начинается с четырех 32-битных смещений своих потомков, затем следует за потомками.
- Меня не волнуют листья, скажем, это просто n последовательных 32-битных чисел.
- Для практических целей мне потребуются некоторые метки узлов или некоторые другие дополнительные данные.
но сейчас меня это тоже не волнует.
Мне кажется, что Haskellers первым выбором при написании бинарных файлов является библиотека Data.Binary.Put. Но с этим у меня есть проблема в пуле # 1. В частности, когда я собираюсь записать Node в файл, чтобы записать дочерние смещения, мне нужно знать мое текущее смещение и размер каждого дочернего элемента.
Это не то, что предоставляет Data.Binary.Put, поэтому я подумал, что это должно быть идеальное применение трансформаторов Монад. Но несмотря на то, что это звучит круто и функционально, до сих пор мне не удался этот подход.
Я задал два других вопроса, которые, как мне казалось, помогут мне решить проблему здесь и здесь . Я должен сказать, что каждый раз, когда я получал очень хорошие ответы, которые помогли мне прогрессировать дальше, но, к сожалению, я все еще не могу решить проблему в целом.
Здесь - это то, что у меня так далеко, оно все еще теряет слишком много памяти для практического применения.
Я бы хотел иметь решение, которое использует такой функциональный подход, но был бы благодарен за любое другое решение.