Решение 1
Тип поля values
вашей записи параметризован двумя переменными типа, поэтому производный пытается использовать общую функцию pp
, которая параметризована ключом и data pretty-printers, например, следующее включит 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
Если вы все еще хотите универсальный c пригодный для печати стол ha sh, то я бы посоветовал против используя оператор include
, но вместо этого реализуйте только необходимый интерфейс для печати для типа ('k,'s) Hashtbl.t
, например,
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]