【问题标题】:OCaml: serialize data into string with additional requirementsOCaml:将数据序列化为带有附加要求的字符串
【发布时间】:2017-07-19 11:58:44
【问题描述】:

我在寻找什么

T为OCaml数据类型,(例如:type t = A | B of int),xT类型的值,是否存在满足以下要求的函数f

  1. fx 映射到一个字符串,即f(x)x 的字符串表示形式
  2. 对于所有u, v in T, u = v 当且仅当f(u) = f(v)
  3. f 可以自动派生,如type t = ... [@@deriving yojson]
  4. 相对简单类型的值的字符串表示形式,如上面定义的,应该是人工可编辑的
  5. (不是必需的,但很高兴拥有)局部性,即如果将上面的类型t扩展为type t = A | B of int | C of something,那么f("A the one before the extending")应该等于f("A the one after the extending"),换句话说,它应该可以升级一个旧版本的类型到新版本很容易

为什么我想要这个

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

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

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

PS,刚接触OCaml,这种事情是不是已经有成熟的解决方案了?

更新

我最终使用了 yojson,因为我的类型很简单,只是零变量,我可以摆脱它,但它是一个远离完美的星系。

更新 2

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

【问题讨论】:

  • 我认为 s 表达式可能(或可能不)满足您的第二个要求的方式很大程度上取决于您的类型 T 以及您定义序列化程序的方式。你会发现更多关于他们(和 Sexplib)here.

标签: postgresql ocaml data-serialization


【解决方案1】:

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

我认为 s 表达式可能(或可能不)满足您的第二个要求的方式很大程度上取决于您的类型 T 和定义序列化程序的方式。你会发现更多关于他们(和 Sexplib)here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多