У меня проблема с функтором (и это результирующий тип). Ниже у меня есть функтор Set, который использует упорядоченный тип. Я фактически использовал set.ml
, который поставляется с ocaml для некоторых рекомендаций, но я, кажется, все делаю правильно. Я создал упорядоченный модуль с целыми числами и применил его к функтору Set, чтобы получить последний модуль в этом примере кода, IntSet.
Следующая строка терпит неудачу, когда я пытаюсь вставить целое число. Я получаю следующую ошибку типа:
Error: This expression has type int but is here used with type
SetInt.elt = Set(OrdInt).elt
Не поймите меня неправильно, система типов здесь верна. Верхний уровень сообщает, что тип SetInt.elt
равен Set(OrdInt).elt
, но когда я выполняю те же операции, чтобы настроить Set, используя тот, который предоставляется ocaml, строка 'same' равна SetInt.elt = OrderedInt.t
. Похоже, я должен получать SetInt.elt = Ordered.t
.
Это так просто, я, наверное, просто пропустил некоторые глупые детали! Argh!
Обратите внимание: я упростил функции member/insert здесь, поскольку эта проблема связана с типами.
module type Ordered =
sig
type t
val lt : t -> t -> bool
val eq : t -> t -> bool
val leq : t -> t -> bool
end
module type S =
sig
type elt
type t
exception Already_Exists
val empty : t
val insert : elt -> t -> t
val member : elt -> t -> bool
end
module Set (Elt:Ordered) : S =
struct
type elt = Elt.t
type t = Leaf | Node of t * elt * t
exception Already_Exists
let empty = Leaf
let insert e t = t
let member e t = false
end
module OrdInt : Ordered =
struct
type t = int
let lt a b = a < b
let eq a b = a = b
let leq a b = a <= b
end
module IntSet = Set (OrdInt)
(* line that fails *)
let one_elm = IntSet.insert 1 IntSet.empty