6

Sexplib の構文拡張により、任意のユーザー定義データ構造のシリアライズとデシリアライズが OCaml で簡単になります。これは通常with sexp、型定義の最後に注釈を追加することによって行われます。

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

これは、ファンクターベースの型に直接一般化されているようには見えません。また、Sexplib 標準型コンバーターが標準ファンクターでさえどのようにキャプチャできるかについても明らかではありません。

int Map.Make(String).tこれまでのところ、シリアル化の前に特定の Map 型のインスタンス (例: ) をリストにフラット化することでこの問題を回避してきました。また、[Bat]Map などの主要なモジュールへのカスタム sexp シリアライゼーションに古いバージョンの Batteries が混在していることにも気付きましたが、これはしばらくの間削除されています。

マップやその他の複雑なファンクター型は、Sexplib シリアライゼーションで一般的にどのように使用されますか?

4

1 に答える 1

2

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

私の記憶が正しければ、バッテリーはそのような機能を削除して、追加のライブラリへの依存を減らしました。もう 1 つのオプションは、これらの機能をすぐに使える Core を使用することです。

于 2012-10-12T15:31:17.383 に答える