这是我的仿函数ORDTYPE。我想在EmptyQueue中使用compare。 我不知道如何注入仿函数。我一直遇到错误,我的签名无效。 我试图声明仿函数(密钥:ORDTYPE) - >在结构之前,但它是错误的。 我不明白算子的想法。我在OCaml维基中看到了一些简单的例子,但我不知道如何处理更复杂的事情。
简而言之,我想在空白中使用比较器。但我不知道如何处理这个更抽象的事情。
module type ORDTYPE =
sig
type t
val compare : t -> t -> int
end;;
module Icmp:ORDTYPE with type t= int=
struct
type t = int
let compare = fun x y -> if( x< y) then 0 else 1
end;;
module type STH=
sig
type priority
type 'a t
val comp: x -> x->bool
end;;
module Emptyqueue (Comp: ORDTYPE): STH with type priority= int =
struct
type priority = int
type 'a t = Empty
let comp = fun x y -> Comp.comp x y
end;;
我编辑了我认为我应该这样做但事实并非如此。工作
答案 0 :(得分:2)
您错过的是需要在签名x
中定义STH
。我将使用更清晰的名称elt
而不是x
。在STH
elt
后,我们也可以将其添加到Emptyqueue
,或使用“破坏性替换”,即签名修改语法with ... := ...
注意我的“拉直”你的例子中引入的差异,因为你有一些不明确的错误纠正。
module type ORDTYPE =
sig
type t
val compare : t -> t -> int
end;;
module Icmp:ORDTYPE with type t= int=
struct
type t = int
let compare = fun x y -> if( x< y) then 0 else 1
end;;
module type STH=
sig
type priority
type 'a t
type elt
val comp: elt -> elt -> bool
end;;
module Emptyqueue (Comp: ORDTYPE):
(STH with type priority= int and type elt := Comp.t) =
struct
type priority = int
type 'a t = Empty
let comp = fun x y -> Comp.compare x y > 0
end;;