PyR*_*lez 6 serialization haskell thunk
在Haskell中,您可以拥有无限列表,因为它不完全计算它们,它使用thunk.我想知道是否有一种方法可以序列化或以其他方式将一个数据保存到文件中.例如,假设您有一个列表[0..]
.然后,你做一些处理就可以了(我最感兴趣tail
和(:)
,但它应该支持这样做filter
或map
为好.)这里是有点什么,我找的一个例子.
serial::(SerialThunk a)=>a->serThunk
serialized = serial ([0..] :: [Int])
main=writeToFile "foo.txt" serialized
Run Code Online (Sandbox Code Playgroud)
和
deserial::(SerialThunk a)=>serThunk->a
main=do
deserialized <- readFromFile "foo.txt" :: IO [Int]
print $ take 10 deserialized
Run Code Online (Sandbox Code Playgroud)
不.无法在Haskell中序列化thunk.一旦代码被编译,它通常表示为汇编(例如,这就是GHC所做的),并且无法恢复函数的可序列化描述,更不用说你想要成为thunk的函数和环境.
是的.您可以构建自定义解决方案,例如描述和序列化Haskell表达式.反序列化和执行可以通过解释(例如使用hint
包)进行.
也许吧.有人(你?)可以编译或修改现有编译器,以平台无关的方式维护更多信息,这样就可以在没有用户手动利用的情况下对事物进行序列化hint
.我想这是一个由云Haskell(又名distributed-haskell
)开发人员正在探索的.
为什么?我还想要一个序列化函数的功能,这样我就可以灵活地传递闭包.但是,大多数情况下,实际上并不需要灵活性,而是人们想要传递某些类型的计算,这些计算可以很容易地表达为自定义数据类型和解释函数.
packman:“Haskell 数据的评估正交序列化,作为一个库”(感谢reddit 链接)——正是我们一直在寻找的!
...此序列化与求值正交:参数在其当前求值状态下序列化,它可能完全未求值(thunk)或仅部分求值(包含 thunk)。
...该库支持在分布式 Haskell 系统的不同节点之间发送和接收数据。这就是代码的起源:Eden 运行时系统。
...除了这个明显的应用之外,该功能还可用于通过记忆(跨不同的程序运行)来优化程序,并在选定的位置检查程序执行。上面链接的幻灯片集中举例说明了这两种用途。
...另一个限制是序列化数据只能由完全相同的二进制文件使用。然而,这对于使用函数式语言进行分布式编程的许多方法来说很常见。
...