首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml:如何将电池和ppx_deriving.*一起使用?

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

Stack Overflow用户
提问于 2017-02-28 16:22:14
回答 1查看 448关注 0票数 4

目前,我正试图将Batteriesppx_deriving.show或类似的东西结合使用。

我想知道如何有效地使用它们。

要创建转储函数,我觉得ppx_deriving.show是有用的。但我有一点小麻烦,把它们像下面这样用在一起。

代码语言:javascript
复制
open Batteries
type t = { a: (int,int) Map.t }
[@@deriving show]

现在没有定义Map.pp,所以不能编译它。

我的特别修正是创建module Map,其中包括Batteries.Map和定义函数pp

代码语言:javascript
复制
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。有人知道如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 04:46:20

你的解决办法是正确的。如果您想对M.t声明的没有[@@deriving]的数据类型使用派生,您必须给出它的方法,比如M.pp for show

代码语言:javascript
复制
module M = struct
  include M
  let pp = ... (* code for pretty-printing M.t *)
end

有一种方法可以部分自动化这一点:

代码语言:javascript
复制
module M = struct
  include M
  type t = M.t = ... (* the same type definition of M.t *)
    [@@deriving show]
end

它使用M.ppt类型生成deriving

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

代码语言:javascript
复制
module M = struct
  include M
  type t = [%import: M.t]
    [@@deriving show]
end

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

正如您已经发现的,派生show of Map.t并不真正有用:通常您不希望看到Map.t的二叉树表示形式,除非您正在调试Map模块本身。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42513872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档