我想爲我的數據類型設置一個字符集(使用Core.Std.Set
),以便我可以使用我的子句類型集的性能優勢(而不是定義type clause = literal list
)。如何滿足Comparable.S與我的類型
type atom = string
type sign = Pos | Neg
type literal = sign * atom
module Literal : sig
type t = literal
include Comparable.S with type t := t
end = struct
module T = struct
type t = literal
let compare t1 t2 =
match (t1,t2) with
| ((Pos,_), (Neg,_)) -> 1
| ((Neg,_), (Pos,_)) -> -1
| ((_,x), (_,y)) -> String.compare x y
end
include T
include Comparable.Make(T)
end
module Clause = Set.Make(Literal)
我是在下真實世界的OCaml,Chapter 13. Maps and Hash Tables通過滿足Comparable.S接口部分。問題是我們沒有sexp_of_t
和t_of_sexp
函數。但是當我將type t = literal
行更改爲type t = literal with sexp
時,編譯器會說Error: Unbound value literal_of_sexp
。 (a)我必須自己執行sexp函數(我不知道我該如何處理這個問題),或者(b)我不應該試圖滿足Comparable.S
(無論如何,我不應該試圖滿足Comparable.S
)由於某種原因,只能用於原始類型)。
我不會說它已被棄用。這是基礎設施的一項新功能,它與'camlp4'具有交叉功能。後者仍然是一個有價值的工具,迄今爲止在當前的基礎架構中有更好的支持,並且適用於所有版本的編譯器和核心(與'ppx'不同)' – ivg
我編輯過,以避免提示camlp4已被棄用。 –