OCaml:将数据序列化为具有其他要求的字符串

时间:2017-07-19 11:58:45

标签: postgresql ocaml data-serialization

我在找什么

T成为OCaml数据类型(例如:type t = A | B of int),x是类型T的值,是否有函数{{1}满足以下要求:

  1. ff映射到字符串,即xf(x)
  2. 的字符串表示形式 {li>适用于所有xu vT当且仅当u = v
  3. f(u) = f(v)可以自动派生,例如f
  4. 相对简单类型的值的字符串表示形式,如上面定义的那样,应该是人类可编辑的
  5. (不是必需的,但很高兴)有地方性,即如果你将上面的type t = ... [@@deriving yojson]类型扩展到t,那么type t = A | B of int | C of something应该等于f("A the one before the extending"),换句话说,它应该将旧版本的类型升级到新版本
  6. 为什么我要这个

    将OCaml数据存储到Postgres列中。我有一个小的Web应用程序,它使用PGOCaml从Postgres获取数据,PGOCaml类型在编译时检查SQL语句,所以如果你在Postgres中f("A the one after the extending"),并稍微更改PGOCaml的源代码(使用在create domain some_type as text之上将Postgres f转换为OCaml类型),您可以将ADT存储到Postgres表中,同时保持类型安全。

    要求中的第二点很重要,因为在Postgres方面,您可能需要测试该列的相等性,并且此类测试是在Postgres text类型上完成的。

    我调查了Sexp,没有找到关于第二点的信息。

    PS,OCaml的新手,这种事情已经有了成熟的解决方案吗?

    更新

    我最终使用了yojson,因为我的类型很简单,只是无效的变体,我可以侥幸逃脱它,它是一个远离完美的星系。

    更新2

    对于那些有类似问题的人,我认为当前最好的解决方案是使用yojson,而不是将其存储在text列中,将其存储在text中,这样,你得到空格和顺序不敏感的比较,(虽然我找不到关于jsonb类型相等的pg&#39文档。)

1 个答案:

答案 0 :(得分:0)

将RichouHunters评论升级为回答,因为我认为Sexplib是一个很好的模块:

我认为s表达式可能(或可能不)满足第二个要求的方式将在很大程度上取决于您的类型T以及定义序列化程序的方式。您将找到更多关于它们的信息(和Sexplib)here