OCaml:如何同时使用batteries和ppx_deriving.*?

4

目前我正在尝试使用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]

它能工作,但是我适应所有数据结构很痛苦...
使用带有 ppx_deriving.sexpCore 是另一种选择,但我更喜欢带有 ppx_deriving.showBatteries。 有人知道如何解决这个问题吗?


经过综合考虑,美化原始数据结构可能并不实用... - nomaddo
1个回答

3

你的修复方法是正确的。 如果你想在没有使用[@@deriving]声明的数据类型M.t上使用自动生成,你必须自行提供其方法,例如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

使用 deriving,可以为类型 t 生成 M.pp

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

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

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

正如您所发现的那样,尽管派生Map.tshow不是真正有用的:通常情况下,您不想看到Map.t的二叉树表示,除非您正在调试Map模块本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接