OCaml: сериализация данных в строку с дополнительными требованиями
что я ищу
Позволять T
быть типом данных OCaml, (пример: type t = A | B of int
), а также x
быть значением типа 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, а тип PGOCaml проверяет оператор SQL во время компиляции, так что если вы create domain some_type as text
в Postgres, и немного измените исходный код PGOCaml (чтобы использовать выше f
конвертировать Postgres text
в тип OCaml), вы можете хранить ADT в таблице Postgres, сохраняя при этом безопасность типов.
Второй пункт в требованиях важен, поскольку на стороне Postgres вам, вероятно, нужно проверить на равенство в этом столбце, и такие тесты проводятся на Postgres. text
тип.
Я заглянул в Sexp, не нашел информации по второму пункту.
PS, новичок в OCaml, у такого рода вещей уже есть зрелое решение?
Обновить
В итоге я использую yojson, так как мой тип очень прост, просто нулевые варианты, я могу с этим сойти, хотя это галактика от идеального.
Обновление 2
Для тех, у кого похожая проблема, я думаю, что наилучшим решением на данный момент является использование yojson, а не его хранение в text
колонка, хранящая его в jsonb
Таким образом, вы получаете пустое пространство и нечувствительное к порядку сравнение (хотя я не могу найти документацию pg по равенству jsonb
тип).
1 ответ
Обновление комментария RichouHunters к ответу, поскольку я думаю, что Sexplib - хороший модуль для этого:
Я думаю, то, как s-выражения могут (или не могут) удовлетворять вашему второму требованию, будет во многом зависеть от вашего типа T и способа определения сериализатора. Вы найдете больше о них (и Sexplib) здесь.