gpt4 book ai didi

ocaml - 在 OCaml 中漂亮地打印一个 Hashtbl 以使用 ppx-deriving

转载 作者:行者123 更新时间:2023-12-04 15:35:57 27 4
gpt4 key购买 nike

我正在尝试使用 ppx 派生在 OCaml 中漂亮地打印包含哈希表(使用基础标准库)的自定义记录类型,但我需要实现 Hashtbl.pp 才能使其工作。

我试过在网上查看例子,我发现最好的例子是 https://github.com/ocaml-ppx/ppx_deriving#testing-plugins ,但我仍然收到奇怪的类型错误,例如“此函数的类型为 Formatter.t -> (string, Value.t) Base.Hashtbl.t -> unit。它应用于太多参数;也许您忘记了 ` ;'"

如何使用 pp 扩展 Hashtbl 模块功能?

到目前为止,这是我的代码(Value.t 是一个自定义类型,我成功地使用 [@@deriving show] 进行了注释:

open Base

(* Extend Hashtbl with a custom pretty-printer *)
module Hashtbl = struct
include Hashtbl

let rec (pp : Formatter.t -> (string, Value.t) Hashtbl.t -> Ppx_deriving_runtime.unit) =
fun fmt -> function
| ht ->
List.iter
~f:(fun (str, value) ->
Caml.Format.fprintf fmt "@[<1>%s: %s@]@." str (Value.string_of value))
(Hashtbl.to_alist ht)

and show : (string, Value.t) Hashtbl.t -> Ppx_deriving_runtime.string =
fun s -> Caml.Format.asprintf "%a" pp s
;;
end

type t =
{ values : (string, Value.t) Hashtbl.t
; enclosing : t option
}
[@@deriving show]

最佳答案

方案一
values的类型您记录的字段是具有两个类型变量的参数化,因此派生者试图使用通用 pp由键和数据 pretty-print 参数化的功能,例如,以下将启用 show对于任何哈希表(具有任何键和任何值,只要键和值是可显示的,

module Hashtbl = struct
include Base.Hashtbl

let pp pp_key pp_value ppf values =
Hashtbl.iteri values ~f:(fun ~key ~data ->
Format.fprintf ppf "@[<1>%a: %a@]@." pp_key key pp_value data)
end

所以你最终可以定义你的类型
type t = {
values : (string,Value.t) Hashtbl.t;
enclosing : t option;
} [@@deriving show]

解决方案2(推荐)

但是,我建议另一种方法,而不是创建一个通用的 Hashtable 模块,而是创建一个专门的 Values模块,例如,
module Values = struct
type t = (string, Value.t) Hashtbl.t

let pp ppf values =
Hashtbl.iteri values ~f:(fun ~key ~data ->
Format.fprintf ppf "@[<1>%s: %s@]@." key (Value.to_string data))
end

现在你可以将它用作,
type t = {
values : Values.t;
enclosing : t option;
} [@@deriving show]

解决方案3

如果你仍然想要一个通用的可打印哈希表,那么我建议不要使用 include语句,而是为 ('k,'s) Hashtbl.t 实现所需的可打印接口(interface)。类型,例如,
module Hashtbl_printable = struct
type ('k,'s) t = ('k, 's) Hashtbl.t

let pp pp_key pp_value ppf values =
Hashtbl.iteri values ~f:(fun ~key ~data ->
Format.fprintf ppf "@[<1>%a: %a@]@." pp_key key pp_value data)
end

type t = {
values : (string, Value.t) Hashtbl_printable.t;
enclosing : t option;
} [@@deriving show]

关于ocaml - 在 OCaml 中漂亮地打印一个 Hashtbl 以使用 ppx-deriving,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com