OCaml理解仿函数的更复杂的例子

时间:2013-12-11 21:01:33

标签: ocaml

这是我的仿函数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;;

我编辑了我认为我应该这样做但事实并非如此。工作

1 个答案:

答案 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;;