作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Sexplib 的语法扩展使得在 OCaml 中任意用户定义的数据结构的序列化和反序列化变得容易。通常通过添加 with sexp
来完成类型定义末尾的注释:
type a = A of int | B of float with sexp
int Map.Make(String).t
)展平为一个列表来解决这个问题,反之亦然,但 Sexplib/Jane Street Core 的雄心勃勃的作者肯定并没有完全忽视这一点.我还注意到旧版本的电池将自定义 sexp 序列化混合到它们的主要模块(如 [Bat]Map)中,但这已经被删除了一段时间。
最佳答案
一种方法是定义一个新的仿函数,它接收序列化数据所需的附加信息。这是我过去在电池上使用的完整实现。注意我也更喜欢 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
关于ocaml - sexplib 如何与 Map 这样的仿函数类型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849968/
Sexplib 的语法扩展使得在 OCaml 中任意用户定义的数据结构的序列化和反序列化变得容易。通常通过添加 with sexp 来完成类型定义末尾的注释: type a = A of int |
我正在使用 with sexp自动生成 s-exp 函数的语法。 问题是我用 sexplib 打印的数据结构有一些递归指针,打印最终会导致堆栈溢出。 所以我需要覆盖一个 to_sexp 函数并让它只返
我正尝试按照 Real World Ocaml 说明设置 emacs ocaml 环境 here ,但是当我启动 utop 时出现错误: No such package: sexplib.syntax
我是一名优秀的程序员,十分优秀!