目前,我尝试将Batteries
与ppx_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]
它有效,但我很难适应所有的数据结构......
Core
ppx_deriving.sexp
是Batteries
的唯一选择,但我更喜欢ppx_deriving.show
和bokeh serve
。
有人知道如何解决这个问题吗?
答案 0 :(得分: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
的{{1}}并不是很有用:通常您不希望看到Map.t
的二叉树表示,除非您正在调试{{ 1}}模块本身。