在Haskell中,您可以拥有无限列表,因为它不会完全计算它们,它会使用thunk。我想知道是否有一种方法可以序列化或以其他方式将一个数据保存到文件中。例如,假设您有一个列表[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
答案 0 :(得分:6)
否即可。无法在Haskell中序列化thunk。一旦代码被编译,它通常表示为汇编(例如,这就是GHC所做的),并且无法恢复函数的可序列化描述,更不用说你想要制作thunk的函数和环境了。
是即可。您可以构建自定义解决方案,例如描述和序列化Haskell表达式。反序列化和执行可以通过解释的方式进行(例如,使用hint
包)。
<强>也许即可。有人(你?)可以编译或修改现有编译器,以平台无关的方式维护更多信息,这样就可以在没有用户手动利用hint
的情况下序列化事物。我想象这是云Haskell(又名distributed-haskell
)开发人员正在探索的。
<强>为什么强>?我还想要一个序列化函数的功能,这样我就可以灵活地传递闭包。但大多数情况下,实际上并不需要灵活性,而是人们希望通过某些类型的计算,这些计算可以很容易地表达为自定义数据类型和解释函数。
答案 1 :(得分:2)
Cloud Haskell支持函数闭包的序列化。 http://www.haskell.org/haskellwiki/Cloud_Haskell
答案 2 :(得分:2)
packman:&#34; Haskell数据的评估正交序列化,作为库&#34; (感谢reddit link) - 正是我们一直在寻找的!
...这个序列化与评估正交:参数是 序列化在其当前的评估状态,它可能是 完全没有评估(thunk)或仅部分评估(包含 的thunk)。
...该库允许在不同节点之间发送和接收数据 分布式Haskell系统。这是代码的起源: 伊甸园运行时系统。
...除了这个明显的应用程序外,还可以使用该功能 通过记忆优化程序(跨越不同的程序运行),和 检查所选位置的程序执行情况。两种用途都是 在上面链接的幻灯片组中举例说明。
...另一个限制是序列化数据只能由 非常相同的二进制文件。然而,这对于许多方法来说是常见的 使用函数式语言进行分布式编程。
...
答案 3 :(得分:0)
除了关于“闭包”的Cloud Haskell和HdpH的工作,还有部分答案表明thunks在运行时无法分析,我发现:
:sprint
似乎可以访问内部的thunk表示 - 。也许GHCi可以使用一些特殊的,非优化的代码。所以原则上可以使用这种表示和执行:sprint如果想要序列化thunk,是不是真的?
http://hackage.haskell.org/package/ghc-heap-view-0.5.3/docs/GHC-HeapView.html - “使用此模块,您可以调查Haskell值的堆表示,即调查共享和延迟评估。”
我很想知道用这种东西可以制作什么样的工作解决方案......