gpt4 book ai didi

haskell - 如何对数据对象进行自动数据序列化?

转载 作者:行者123 更新时间:2023-12-02 01:01:05 25 4
gpt4 key购买 nike

具有某种反射/内省(introspection)的语言的巨大好处之一是可以从各种来源自动构造对象。

例如,在 Java 中,我可以使用相同的对象来持久化到数据库(使用 Hibernate)、序列化为 XML(使用 JAXB)以及序列化为 JSON(json-lib)。您可以在 Ruby 和 Python 中执行相同的操作,通常也遵循 Java 属性或注释的一些简单规则。

因此我不需要很多“域传输对象”。我可以专注于我正在工作的领域。

在像 Haskell 和 Ocaml 这样非常严格的函数式编程中,这似乎是不可能的。特别是 haskell 。我所看到的唯一的事情就是进行某种预处理或元编程(ocaml)。难道所有的转变都必须从下往上进行吗?

换句话说,你必须做很多无聊的工作才能将 haskell 中的数据类型转换为 JSON/XML/DB Row 对象,然后再转换回数据对象。

最佳答案

我无法与 OCaml 交谈,但我想说 Haskell 的主要困难是反序列化需要提前知道类型——没有通用的方法可以从格式中机械地反序列化,找出结果值是什么,然后从那里开始,这在具有不健全或动态类型系统的语言中是可能的。

抛开类型问题,Haskell 中有多种序列化数据的方法:

  • 内置类型类Read/Show将代数数据类型和大多数内置类型序列化(反)序列化为字符串。行为良好的实例通常应该是 read 。 show 等价于 id,并且 show 的结果可以解析为构造序列化值的 Haskell 源代码。

  • Hackage上可以找到各种序列化包;通常,这些要求要序列化的类型是某个类型类的实例,而包为大多数内置类型提供实例。有时,它们仅需要类型具体化、反射元编程 Data 类的自动派生实例(迷人的完全限定名称为 Data.Data.Data),或者提供用于自动生成实例的模板 Haskell 代码。

  • 对于真正不寻常的序列化格式,或者像前面提到的那样创建自己的包,人们可以使用可用的最大锤子,有点像“老大哥”来阅读Show:解析和 pretty-print 。有许多软件包可用于两者,虽然一开始听起来可能令人生畏,但实际上 Haskell 中的解析和 pretty-print 非常轻松。

看一眼 Hackage,就会发现各种格式的序列化包已经存在,包括二进制数据、JSON、YAML 和 XML,尽管我没有使用过它们中的任何一个,所以我无法亲自证明它们的工作效果如何。以下是帮助您入门的非详尽列表:

  • binary :面向性能的序列化为惰性 ByteStrings
  • cereal :与二进制类似,但接口(interface)略有不同,并使用严格的 ByteStrings
  • genericserialize :通过内置元编程进行序列化,输出格式可扩展,包括R5RS sexp输出。
  • json :JSON数据的轻量级序列化
  • RJson :通过内置元编程序列化为 JSON
  • hexpat-pickle :使用“hexpat”包序列化为 XML 的组合器
  • regular-xmlpickler :使用“常规”包将递归数据结构序列化为 XML

唯一的另一个问题是,不可避免的是,并非所有类型都可以序列化——如果不出意外的话,我怀疑您将很难序列化多态类型、存在类型和函数。

关于haskell - 如何对数据对象进行自动数据序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com