OCaml: сериализация данных в строку с дополнительными требованиями

что я ищу

Позволять T быть типом данных OCaml, (пример: type t = A | B of int), а также x быть значением типа Tесть ли функция f это удовлетворяет следующим требованиям:

  1. f карты x в строку, т.е. f(x) является строковым представлением x
  2. для всех u, v в 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 во время компиляции, так что если вы 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) здесь.

Другие вопросы по тегам