Вы не можете реализовать функции в сигнатуре модуля.Я думаю, что проблема, с которой вы столкнулись, решается с помощью функторов в OCaml.
Пример кода, который вы можете посмотреть, чтобы понять, как это работает, - реализация Set .
В вашем случае это будет выглядеть примерно так:
РЕДАКТИРОВАТЬ: принимая во внимание вклады Ричарда Дегенна, октахрона и PatJ:
module type Order =
sig
type t
val compare: t -> t -> int
end
module type Util =
sig
type t
val compare: t -> t -> int
val max: t -> t -> t
end
module Make(Ord: Order): Util with type t := Ord.t =
struct
type t = Ord.t
let compare = Ord.compare
let max a b = if (Ord.compare a b > 0) then a else b
end
Чтобы использовать его, вы можете сделать:
(*You first define a module for the specific case of int*)
module IntOrder = struct
type t = int
let compare = compare
end
(*You use the new module to build the corresponding Util module*)
module IntUtil = Make(IntOrder)
(*You can now use the functions defined in Util as if it was any other module*)
let x = IntUtil.max 1 2
let y = IntUtil.compare 1 2
(*But if you try to call it with the wrong type you get an error*)
let z = IntUtil.compare 1.6 2.5