最好的方法是获取函数的表示(如果可以某种方式恢复)。出于效率原因,优选二进制序列化。
我认为有一种方法可以在Clean中实现,因为实现iTask是不可能的,因为当服务器再次运行时,依赖于任务(以及其他功能)可以保存并继续。
这对于分布式haskell计算必不可少。
我不是要在运行时解析haskell代码,如下所述:Serialization of functions in Haskell。 我还需要序列化而不仅仅是反序列化。
答案 0 :(得分:28)
不幸的是,目前的ghc运行时系统无法实现。 函数和其他任意数据的序列化需要一些ghc实现者不愿意添加的低级运行时支持。
序列化功能要求您可以序列化任何内容,因为任意数据(已评估和未评估)可以是函数的一部分(例如,部分应用程序)。
答案 1 :(得分:22)
没有。但是,CloudHaskell项目正在推动GHC中对显式关闭序列化支持的需求。 CloudHaskell与显式闭包最接近的是distributed-static包。另一种尝试是HdpH closure representation。但是,两者都以托马斯describes below的方式使用模板Haskell。
限制是GHC缺乏静态支持,目前尚未提及GHC ticket。 (任何接受者?)。 CloudHaskell邮件列表上有a discussion关于静态支持应该是什么样子的,但据我所知,还没有任何进展。
最接近设计和实施的人是Jost Berthold,他在Eden中实现了功能序列化。见他的IFL 2010论文"Orthogonal Serialisation for Haskell"。序列化支持融入到Eden运行时系统中。 (现在作为单独的库提供:packman。不确定它是否可以与GHC一起使用,或者需要像Eden fork那样修补GHC ......)GHC需要类似的东西。这是序列化支持Eden,在GHC 7.4分发的版本中:
data Serialized a = Serialized { packetSize :: Int , packetData :: ByteArray# }
serialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
所以:可以序列化函数和数据结构。 Binary
有一个Serialized a
实例,允许您检查长时间运行的计算文件! (见Secion 4.1)。
在GHC基础库中支持这种简单的序列化API肯定是分布式Haskell编程的圣杯。它可能会简化分布式Haskell风格之间的可组合性(CloudHaskell,MetaPar,HdpH,Eden等等......)
答案 2 :(得分:20)
结帐Cloud Haskell。它有一个名为Closure
的概念,用于以类型安全的方式发送要在远程节点上执行的代码。
答案 3 :(得分:2)
Eden可能最接近并且可能应该得到一个单独的答案:( De-)可以对未评估的thunk进行序列化,参见https://github.com/jberthold/packman。
然而,反序列化仅限于同一程序(程序是“编译结果”)。由于函数被序列化为代码指针,因此以前未知的函数无法反序列化。
可能的用法:
答案 4 :(得分:0)
一个非常简单实用的,但可能不那么优雅的解决方案(最好自动生成GHC)将每个函数编译成与机器无关的字节码的单独模块,每当需要序列化该函数时序列化该字节码,并使用dynamic-loader
或plugins
包,以动态加载它们,因此即使是以前未知的功能也可以使用。
由于模块记录了所有依赖项,因此可以(de)序列化并加载它们。实际上,序列化索引号并附加字节码blob的索引列表可能是最有效的。
我认为只要你自己编译模块,现在就已经可以了。
正如我所说,它不会很漂亮。更不用说从不安全的源代码反序列化代码以在不安全的环境中运行的一般巨大的安全风险。 :-)
(当然,如果它值得信赖,那就没问题了。)
我现在不打算在这里编写代码。 ; - )