I'm trying to save a simple (but quite big) Tree structure into a binary file using Haskell. The structure looks something like this:
-- For simplicity assume each Node has only 4 childs data Tree = Node [Tree] | Leaf [Int]And here is how I need the data look on disk:
- Каждый узел начинается с четырех 32-битных смещений к своим дочерним элементам, а затем следует за дочерними элементами.
- Меня не волнуют листья, скажем, это просто n последовательных 32-битных чисел.
- Для практических целей мне понадобятся некоторые метки узлов или некоторые другие дополнительные данные, но сейчас меня это тоже не волнует.
Мне кажется, что первым выбором Haskeller при написании двоичных файлов является библиотека Data.Binary.Put. А вот с этим у меня проблема в пуле №1. В частности, когда я собираюсь записать узел в файл, чтобы записать дочерние смещения, мне нужно знать свое текущее смещение и размер каждого дочернего элемента.
Это не то, что предоставляет Data.Binary.Put, поэтому я подумал, что это должно быть идеальное применение преобразователей Monad. Но хоть это звучит круто и функционально, пока у меня не получилось с таким подходом.
Я задал два других вопроса, которые, как я думал, помогут мне решить проблему -leak">здесь и здесь. Я должен сказать, что каждый раз я получал очень хорошие ответы, которые помогали мне двигаться дальше, но, к сожалению, я все еще не могу решить проблему в целом.
Вот то, что у меня есть до сих пор, это все еще слишком много памяти, чтобы быть практичным.
Я хотел бы иметь решение, использующее такой функциональный подход, но был бы признателен и за любое другое решение.