OCaml:如何一起使用电池和 ppx_deriving.*?

OCaml: how to use batteries and ppx_deriving.* together?

目前我正在尝试将 Batteriesppx_deriving.show 或类似的东西一起使用。
我想知道如何有效地一起使用它们。

创建转储函数,我觉得ppx_deriving.show有用。 但是我在像下面这样一起使用它们时遇到了一些麻烦。

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

现在Map.pp没有定义,无法编译

我的临时修复是创建 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]

它有效,但适应所有数据结构对我来说很痛苦...
Coreppx_deriving.sexp 是另一种选择,但我更喜欢 Batteriesppx_deriving.show。 有人知道如何解决这个问题吗?

您的解决方法是正确的。如果你想对没有[@@deriving]声明的数据类型M.t使用派生,你必须自己给它的方法,比如M.pp for 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

它使用 deriving.

为类型 t 生成 M.pp

使用 ppx_import,您可以避免复制和粘贴定义:

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

这应该扩展到以前的代码。

正如您所发现的,从 Map.t 导出 show 并不是很有用:通常您不想看到 Map.t 的二叉树表示,除非您正在调试Map 模块本身。