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
сам модуль.