OCaml:如何一起使用电池和 ppx_deriving.*?
OCaml: how to use batteries and ppx_deriving.* together?
目前我正在尝试将 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
。
有人知道如何解决这个问题吗?
您的解决方法是正确的。如果你想对没有[@@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
模块本身。
目前我正在尝试将 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
。
有人知道如何解决这个问题吗?
您的解决方法是正确的。如果你想对没有[@@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
模块本身。