Как мне сериализовать или сохранить в файл 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, т.е. исследовать совместное использование и ленивая оценка."

Мне было бы очень любопытно узнать, какие рабочие решения для сериализации могут быть сделаны из этого материала...

Другие вопросы по тегам