我在找什么
假设T
为 OCaml 数据类型(例如:)type t = A | B of int
,并x
为 type 的值,是否存在满足以下要求T
的函数:f
f
映射x
到一个字符串,即f(x)
是一个字符串表示x
- 对于所有
u
,v
在T
,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 获取数据的小型 Web 应用程序,并且 PGOCaml 类型在编译时检查 SQL 语句,所以如果你create domain some_type as text
在 Postgres 中,并稍微更改 PGOCaml 的源代码(使用上面f
的转换 Postgrestext
到 OCaml 类型),您可以将 ADT 存储到 Postgres 表中,同时保持类型安全。
要求中的第二点很重要,因为在 Postgres 方面,您可能需要测试该列的相等性,并且此类测试是在 Postgrestext
类型上完成的。
我查看了 Sexp,没有找到关于第二点的信息。
PS,刚接触OCaml,这种东西是不是已经有成熟的解决方案了?
更新
我最终使用了 yojson,因为我的类型非常简单,只是零变量,我可以摆脱它,虽然它是一个远离完美的星系。
更新 2
对于那些有类似问题的人,我认为当前最好的解决方案是使用 yojson,而不是将其存储在text
列中,将其存储在 a 中jsonb
,这样,您可以获得空格和顺序不敏感的比较,(虽然我找不到pg 的关于jsonb
类型相等性的文档)。