Как мне сериализовать или сохранить в файл Thunk?
В Haskell вы можете иметь бесконечные списки, потому что он не вычисляет их полностью, он использует thunks. Мне интересно, есть ли способ сериализации или иным образом сохранить в файл кусок данных. Например, скажем, у вас есть список [0..]
, Затем вы делаете некоторую обработку (я в основном заинтересован в tail
а также (:)
, но это должно поддержать выполнение filter
или же map
а также.) Вот пример того, что я ищу.
serial::(SerialThunk a)=>a->serThunk
serialized = serial ([0..] :: [Int])
main=writeToFile "foo.txt" serialized
А также
deserial::(SerialThunk a)=>serThunk->a
main=do
deserialized <- readFromFile "foo.txt" :: IO [Int]
print $ take 10 deserialized
4 ответа
packman: "Оценочная ортогональная сериализация данных Haskell, как библиотеки" (благодаря ссылке Reddit) - это именно то, что мы искали!
... эта сериализация ортогональна оценке: аргумент сериализуется в его текущем состоянии оценки, он может быть полностью не оценен (группа) или только частично оценен (содержит блоки).
... Библиотека позволяет отправлять и получать данные между различными узлами распределенной системы Haskell. Вот откуда и появился код: система времени исполнения Eden.
... Помимо этого очевидного приложения, функциональность может быть использована для оптимизации программ путем запоминания (при разных запусках программ) и для контроля выполнения программ в выбранных местах. Оба использования иллюстрируются в наборе слайдов, связанном выше.
... Другое ограничение заключается в том, что сериализованные данные могут использоваться только одним и тем же двоичным файлом. Это, однако, является общим для многих подходов к распределенному программированию с использованием функциональных языков.
...
Нет В Haskell нет способа сериализации Thunk. После того как код скомпилирован, он обычно представляется как сборка (например, это то, что делает GHC), и нет способа восстановить сериализуемое описание функции, не говоря уже о функции и среде, которые вы хотели бы создать.
Да Вы можете создавать собственные решения, такие как описание и сериализация выражения Haskell. Десериализация и исполнение могут происходить путем интерпретации (например, с использованием hint
пакет).
Может быть Кто-то (вы?) Мог бы создать компилятор или модифицировать существующий компилятор, чтобы поддерживать больше информации в зависимости от платформы, так чтобы вещи могли быть сериализованы без использования пользователем вручную. hint
, Я представляю, что это находится в стадии изучения Облако Haskell (ака distributed-haskell
) Разработчики.
Почему? Я также хотел иметь возможность сериализации функций, чтобы можно было гибко передавать замыкания. Однако в большинстве случаев такая гибкость на самом деле не нужна, и вместо этого люди хотят проходить определенные типы вычислений, которые можно легко выразить как пользовательский тип данных и функцию интерпретации.
Cloud Haskell поддерживает сериализацию замыканий функций. http://www.haskell.org/haskellwiki/Cloud_Haskell
Помимо работы в Cloud Haskell и HdpH над "замыканиями" и части ответов о том, что thunk не анализируются во время выполнения, я обнаружил, что:
:sprint
в GHCi похоже есть доступ к внутреннему представлению thunk -. Возможно, GHCi работает с каким-то особым неоптимизированным кодом. Таким образом, в принципе можно использовать это представление и реализацию: sprint, если кто-то хочет сериализировать thunks, не правда ли?http://hackage.haskell.org/package/ghc-heap-view-0.5.3/docs/GHC-HeapView.html - "С помощью этого модуля вы можете исследовать представление кучи значений Haskell, т.е. исследовать совместное использование и ленивая оценка."
Мне было бы очень любопытно узнать, какие рабочие решения для сериализации могут быть сделаны из этого материала...