gpt4 book ai didi

ocaml - sexplib 如何与 Map 这样的仿函数类型一起使用?

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

Sexplib 的语法扩展使得在 OCaml 中任意用户定义的数据结构的序列化和反序列化变得容易。通常通过添加 with sexp 来完成类型定义末尾的注释:

type a = A of int | B of float with sexp

这似乎没有直接推广到基于仿函数的类型,也不清楚 Sexplib 标准类型转换器如何捕获甚至标准仿函数。

到目前为止,我已经通过在序列化之前将特定的 Map 类型实例(例如 int Map.Make(String).t )展平为一个列表来解决这个问题,反之亦然,但 Sexplib/Jane Street Core 的雄心勃勃的作者肯定并没有完全忽视这一点.我还注意到旧版本的电池将自定义 sexp 序列化混合到它们的主要模块(如 [Bat]Map)中,但这已经被删除了一段时间。

Sexplib 序列化通常如何使用 Maps 或其他复杂仿函数类型?

最佳答案

一种方法是定义一个新的仿函数,它接收序列化数据所需的附加信息。这是我过去在电池上使用的完整实现。注意我也更喜欢 Map 的无异常和标记版本,所以我已经打开了这些,但你当然可以删除它。

module type SEXPABLE = sig
type t
val sexp_of_t : t -> Sexplib.Sexp.t
val t_of_sexp : Sexplib.Sexp.t -> t
end

module Map = struct

module type S = sig
include BatMap.S
include module type of Labels
include module type of Exceptionless
val sexp_of_t : ('a -> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a t
end

module Make (Ord : BatInterfaces.OrderedType)
(Sexpable : SEXPABLE with type t = Ord.t)
: S with type key = Ord.t = struct
include BatMap.Make(Ord)
include Labels
include Exceptionless

open Sexplib.Sexp
open Sexplib.Conv

let sexp_of_t sexp_of_data t =
let f ~key ~data ans = List [Sexpable.sexp_of_t key; sexp_of_data data] :: ans in
List (fold ~f ~init:[] t)

let t_of_sexp data_of_sexp sexp = match sexp with
| Atom _ -> of_sexp_error "Map.Make(...).t_of_sexp: list needed" sexp
| List l ->
let f ans = function
| List [key_sexp; data_sexp] ->
let key = Sexpable.t_of_sexp key_sexp in
let data = data_of_sexp data_sexp in
add ~key ~data ans
| List _ | Atom _ ->
of_sexp_error "Map.Make(...).t_of_sexp: 2-tuple list needed" sexp
in
List.fold_left ~f ~init:empty l
end
end

如果我没记错的话,Batteries 删除了这些功能以减少对其他库的依赖。您的另一个选择是使用 Core,它具有开箱即用的这些功能。

关于ocaml - sexplib 如何与 Map 这样的仿函数类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849968/

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