让T
成为OCaml数据类型(例如:type t = A | B of int
),x
是类型T
的值,是否有函数{{1}满足以下要求:
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")
,换句话说,它应该将旧版本的类型升级到新版本将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,因为我的类型很简单,只是无效的变体,我可以侥幸逃脱它,它是一个远离完美的星系。
对于那些有类似问题的人,我认为当前最好的解决方案是使用yojson,而不是将其存储在text
列中,将其存储在text
中,这样,你得到空格和顺序不敏感的比较,(虽然我找不到关于jsonb
类型相等的pg&#39文档。)
答案 0 :(得分:0)
将RichouHunters评论升级为回答,因为我认为Sexplib是一个很好的模块:
我认为s表达式可能(或可能不)满足第二个要求的方式将在很大程度上取决于您的类型T以及定义序列化程序的方式。您将找到更多关于它们的信息(和Sexplib)here。