OCaml: как использовать батареи и ppx_deriving.* Вместе?

В настоящее время я пытаюсь использовать Batteries с ppx_deriving.show или что-то подобное.
Мне интересно, как использовать их вместе с пользой.

Я считаю, что для создания дамп-функций ppx_deriving.show полезен. Но у меня есть небольшие проблемы с использованием их вместе, как следующие.

open Batteries
type t = { a: (int,int) Map.t }
[@@deriving show]

Сейчас Map.pp не определено, поэтому не может быть скомпилировано.

Мое adhoc исправить это то, что я создаю module Map который включает в себя Batteries.Map и определить функцию pp,

open Batteries
module Map = struct
  include Map
  let pp f g fmt t = ... (* create dump function by man hand *)
end

type t = { a: (int,int) Map.t }
[@@deriving show]

Это работает, но мне больно адаптировать все структуры данных...
Core с ppx_deriving.sexp это альтернативный выбор, но я предпочитаю Batteries с ppx_deriving.show, Кто-нибудь знает, как решить проблему?

1 ответ

Решение

Ваше исправление - верный путь. Если вы хотите использовать производные для типов данных M.t объявлено без [@@deriving], вы должны дать такие методы, как M.pp за show самостоятельно:

module M = struct
  include M
  let pp = ... (* code for pretty-printing M.t *)
end

Есть способ частично автоматизировать это:

module M = struct
  include M
  type t = M.t = ... (* the same type definition of M.t *)
    [@@deriving show]
end

Генерирует M.pp для типа t с помощью deriving,

С ppx_importВы можете избежать копирования и вставки определения:

module M = struct
  include M
  type t = [%import: M.t]
    [@@deriving show]
end

Это должно быть расширено до прежнего кода.

Как вы выяснили, выводя show из Map.t не очень полезно, хотя: обычно вы не хотите видеть двоичное представление дерева Map.t если вы не отлаживаете Map сам модуль.

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