【发布时间】:2017-07-19 11:58:44
【问题描述】:
我在寻找什么
令T为OCaml数据类型,(例如:type t = A | B of int),x为T类型的值,是否存在满足以下要求的函数f:
-
f将x映射到一个字符串,即f(x)是x的字符串表示形式 - 对于所有
u,vinT,u = v当且仅当f(u) = f(v) -
f可以自动派生,如type t = ... [@@deriving yojson] - 相对简单类型的值的字符串表示形式,如上面定义的,应该是人工可编辑的
- (不是必需的,但很高兴拥有)局部性,即如果将上面的类型
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