+1, хороший трюк с генератором

аюсь сохранить простую (но довольно большую) древовидную структуру в двоичный файл, используя 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, поэтому я подумал, что это должно быть идеальное применение трансформаторов Монады. Но несмотря на то, что это звучит круто и функционально, до сих пор мне не удался этот подход.

Я задал два других вопроса, которые, как я думал, помогут мне решить проблемуВот а такжеВот, Я должен сказать, что каждый раз, когда я получал очень хорошие ответы, которые помогли мне прогрессировать дальше, но, к сожалению, я все еще не могу решить проблему в целом.

Вот это то, что у меня так далеко, все еще слишком много памяти, чтобы быть практичным.

Я хотел бы иметь решение, которое использует такой функциональный подход, но был бы благодарен за любое другое решение.

Ответы на вопрос(4)

Ваш ответ на вопрос