2013-12-11 5 views
1

Это мой функтор ORDTYPE. Я хочу использовать сравнение внутри EmptyQueue. Я не знал, как вводить функтор. Все время я получаю ошибки, у которых есть недопустимая подпись. Я пытался объявить функтор (ключ: ORDTYPE) -> до структуры, но это было неправильно. Я не понимаю идеи функторов. Я вижу несколько простых примеров в вики OCaml, но я не знал, как справляться с чем-то более сложным.Функциональные функции 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;; 

Я отредактировал, как я думаю, что должен делать это, но это не так. Работа.

ответ

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;; 
Смежные вопросы