4

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

要创建转储函数,我觉得 ppx_deriving.show 很有用。但是我在使用它们时遇到了一些麻烦,如下所示。

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

nowMap.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]

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

4

1 回答 1

3

你的解决方法是正确的。如果要对M.t未声明的数据类型使用派生[@@deriving],则必须自己提供其方法,例如M.ppfor 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_tderiving

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

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

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

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

于 2017-03-01T04:46:20.870 回答