6

在 Haskell 中,您可以拥有无​​限列表,因为它不会完全计算它们,而是使用 thunk。我想知道是否有一种方法可以序列化或以其他方式将一段数据的 thunk 保存到文件中。例如,假设您有一个列表[0..]。然后你对它进行一些处理(我最感兴趣的是tailand (:),但它应该也支持做filteror 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

4 回答 4

6

没有。没有办法在 Haskell 中序列化一个 thunk。一旦代码被编译,它通常被表示为程序集(例如,这就是 GHC 所做的)并且没有办法恢复函数的可序列化描述,更不用说你想要生成的函数和环境了。

的。您可以构建自定义解决方案,例如描述和序列化 Haskell 表达式。反序列化和执行可以通过解释的方式发生(例如使用hint包)。

也许。有人(你?)可以制作编译器或修改现有编译器,以与平台无关的方式维护更多信息,以便用户无需手动利用hint. 我想象这是 Cloud Haskell(又名distributed-haskell)开发人员正在探索的一个过程。

为什么?我还想要一种序列化函数的能力,以便我可以灵活地传递闭包。但大多数时候,实际上并不需要这种灵活性,而是人们希望传递某些类型的计算,这些计算可以很容易地表示为自定义数据类型和解释函数。

于 2014-03-08T17:43:57.020 回答
2

Cloud Haskell 支持函数闭包的序列化。http://www.haskell.org/haskellwiki/Cloud_Haskell

于 2014-03-08T20:10:10.633 回答
2

packman:“作为库的 Haskell 数据的评估正交序列化”(感谢reddit 链接)——这正是我们一直在寻找的!

...这种序列化与评估正交:参数在其当前的评估状态下被序列化,它可能完全未评估(一个 thunk)或仅部分评估(包含 thunk)。

...该库支持在分布式 Haskell 系统的不同节点之间发送和接收数据。这就是代码的来源:Eden 运行时系统。

...除了这个明显的应用程序之外,该功能还可用于通过记忆优化程序(跨不同的程序运行),并在选定的位置检查程序执行。这两种用途都在上面链接的幻灯片中进行了举例说明。

...另一个限制是序列化数据只能由相同的二进制文件使用。然而,这对于使用函数式语言进行分布式编程的许多方法来说很常见。

...

于 2015-07-10T11:19:02.007 回答
0

除了在 Cloud Haskell 和 HdpH 中关于“闭包”的工作,以及在运行时无法分析 thunk 的部分答案之外,我发现:

  • :sprint在 GHCi 中似乎可以访问内部 thunk 表示 - . 也许 GHCi 可以处理一些特殊的、未优化的代码。因此,原则上,如果想要序列化 ​​thunk,可以使用这种表示和 :sprint 的实现,不是吗?

  • http://hackage.haskell.org/package/ghc-heap-view-0.5.3/docs/GHC-HeapView.html -- “使用这个模块,你可以调查Haskell值的堆表示,即调查共享和懒惰的评价。”

我很想知道可以用这些东西制作什么样的用于序列化闭包的工作解决方案......

于 2015-02-10T15:07:02.767 回答