Haskell功能可以序列化吗?

Bol*_*eth 26 serialization distributed haskell deserialization

最好的方法是获取函数的表示(如果它可以以某种方式恢复).出于效率原因,优选二进制序列化.

我认为有一种方法可以在Clean中实现,因为实现iTask是不可能的,因为当服务器再次运行时,依赖于任务(以及其他功能)可以保存并继续.

这对于分布式haskell计算必不可少.

我不打算在运行时解析haskell代码,如下所述:Haskell中的函数序列化.我还需要序列化而不仅仅是反序列化.

aug*_*tss 28

不幸的是,使用当前的ghc运行时系统是不可能的.函数和其他任意数据的序列化需要一些ghc实现者不愿意添加的低级运行时支持.

序列化函数要求您可以序列化任何内容,因为任意数据(已评估和未评估)可以是函数的一部分(例如,部分应用程序).


Rob*_*art 22

不会.然而,CloudHaskell项目正在推动对GHC中显式关闭序列化支持的需求.CloudHaskell与显式闭包最接近的是分布式静态包.另一种尝试是HdpH闭包表示.但是,两者都使用了模板Haskell,就像Thomas 在下面描述的那样.

限制是GHC缺乏静态支持,目前尚未获得GHC门票.(任何接受者?).已经有一个讨论什么静态支持其实应该看起来像CloudHaskell邮件列表上,但没有还没有就我知道的进展.

最接近设计和实现的是Jost Berthold,他在Eden中实现了功能序列化.请参阅他的IFL 2010论文"Haskell的正交序列化".序列化支持融入到Eden运行时系统中.(现在作为单独的库提供:packman.不确定它是否可以与GHC一起使用,或者需要像Eden fork一样修补GHC ......)GHC需要类似的东西.这是从GHC 7.4派生的版本中的序列化支持Eden:

data Serialized a = Serialized { packetSize :: Int , packetData :: ByteArray# }
serialize   :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
Run Code Online (Sandbox Code Playgroud)

所以:人们可以序列化函数数据结构.有一个Binary实例Serialized a,允许您检查长时间运行的计算文件!(见Secion 4.1).

在GHC基础库中支持这种简单的序列化API肯定是分布式Haskell编程的圣杯.它可能会简化分布式Haskell风格(CloudHaskell,MetaPar,HdpH,Eden等等)之间的可组合性.

  • 奥古斯丁:对于正确的低级别比特存在一些争议!我们中的许多人都不是原始论文中描述的"传递指针"语义的粉丝.你对你认为合适的"低级别比特"的意见非常受欢迎,因为我知道你已经制定了至少一个可用于生产的答案. (5认同)
  • @sclv严格评估会更容易一些.然后您只需传输值,而使用延迟评估,您可以选择何时何地进行评估. (4认同)
  • HdpH的闭包似乎更强大,接近发送您想要的任何计算(在阅读http://www.macs.hw.ac.uk/~pm175/papers/Maier_Trinder_IFL2011_XT.pdf后的印象之后).Cloud Haskell的"简单"闭包似乎仅限于发送顶级函数和序列化的**强制**环境.因此,如果您希望发送部分评估的expr,则您遇到了麻烦.HdpH引入了闭包组合,所以如果你将代码编写为闭包(而不是函数)的组合,你必须能够对expr结构进行"深度"控制,是不是真的? (2认同)
  • 一个跟进。上面提到的票 https://ghc.haskell.org/trac/ghc/ticket/7015 已关闭。而 StaticPtr 现在是 GHC 7.10.x 的一部分。 (2认同)

Ank*_*kur 20

查看Cloud Haskell.它有一个概念Closure,用于以类型安全的方式发送要在远程节点上执行的代码.

  • 注意云haskell实际上并不发送代码,只是一个环境和索引值,假设一个正确的设置伙伴,可以用来查找感兴趣的例程. (15认同)