Ocaml合并签名
假设我有两个签名,Ordered和Field。
module type ORDERED = sig
type t
type comparison = LT | EQ | GT
val cmp : t -> t -> comparison
end
module type FIELD = sig
type t
val (+) : t -> t -> t
val ( * ) : t -> t -> t
val inv : t -> t
val neg : t -> t
val zero : t
val one : t
end
我想创建一个函数对象,它接受两个有序域 Ordered Fields
并生成另一个有序域 Ordered Field
(假设对操作进行分量应用并使用字典顺序进行比较)。我该如何指定“输入模块”同时满足两个签名?
以下是一些草稿语法,适用于我要完成的任务:
module NaivePair = functor (Left : ORDERED & FIELD) (Right : ORDERED & FIELD) ->
struct
type t = Left.t * Right.t
(* definitions *)
end
可能有一种优雅的方法可以将签名(但不是匿名联合)"联合"起来,或者创建一个包装器模块,围绕具体的ORDERED
和FIELD
实现,它们恰好共享一个类型t。 我很好奇我所尝试实现的OCaml习惯用法是什么。