2012-10-11 35 views
6

Sexplib的语法扩展使OCaml中的任意用户定义数据结构的序列化和反序列化变得容易。它通常是将一个with sexp注释类型定义的最后完成:sexplib如何与Map这样的函数类型一起使用?

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

这似乎并不直接推广到基于仿函数类型,也不是明确的Sexplib标准型转换器怎么能捕捉标准仿函数。

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

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

+2

我想你会使用一个扩展的标准库与普及sexplib转换函数。你看过Core吗?我只花了5分钟的时间,但是在这5分钟里我应用了函数Set.Make',它向我提供了参数类型上的sexplib转换函数,以便它可以为结果集类型创建sexplib转换函数。 –

回答

1

一种方法是定义一个新的函子,它接受序列化数据所需的附加信息。这是我以前用电池完成的一个完整实现。注意我也更喜欢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 

如果我没有记错,取出电池等功能,以减少额外的库的依赖关系。您的其他选择是使用Core,它具有开箱即用的功能。

相关问题