Учу Ocaml. Вот пример модуля очереди приоритетов, не могу понять, почему не работает. Помогите пожалуйста. (* prioQueue.mli: *) module type OrderedType = sig type t val compare : t -> t -> int end module type PrioQueue = sig type priority type 'a queue exception Queue_is_empty val empty : 'a queue val insert : 'a queue -> priority -> 'a -> 'a queue val extract : 'a queue -> priority * 'a * 'a queue end module DPrioQueue (Elt: OrderedType) : (PrioQueue with type priority = Elt.t) (* prioQueue.ml: *) module type OrderedType = sig type t val compare : t -> t -> int end module type PrioQueue = sig type priority type 'a queue exception Queue_is_empty val empty : 'a queue val insert : 'a queue -> priority -> 'a -> 'a queue val extract : 'a queue -> priority * 'a * 'a queue end module DPrioQueue (Elt: OrderedType) : (PrioQueue with type priority = Elt.t) = struct type priority = Elt.t type 'a queue = Empty | Node of priority * 'a * 'a queue * 'a queue exception Queue_is_empty let empty = Empty let rec insert queue p e = match queue with Empty -> Node (p, e, Empty, Empty) | Node (prio, elt, left, right) -> if Elt.compare p prio <= 0 then Node (p, e, insert right prio elt, left) else Node (prio, elt, insert right p e, left) let rec remove_top = function Empty -> raise Queue_is_empty | Node (prio, elt, left, Empty) -> left | Node (prio, elt, Empty, right) -> right | Node (_, _, (Node (lprio, lelt, _, _) as left), (Node (rprio, relt, _, _) as right)) -> if Elt.compare lprio rprio <= 0 then Node (lprio, lelt, remove_top left, right) else Node (rprio, relt, left, remove_top right) let extract = function Empty -> raise Queue_is_empty | Node (prio, elt, _, _) as queue -> (prio, elt, remove_top queue) end (* main.ml: *) module IntOrderedType : PrioQueue.OrderedType = struct type t = int let compare x y = if x < y then -1 else if x > y then 1 else 0 end ;; module IntPrioQueue = PrioQueue.DPrioQueue (IntOrderedType) let main () = let instream = open_in "input.txt" in let outstream = open_out "output.txt" in let rec input_iter pq = try let i = Scanf.fscanf instream "%d" (function x -> x) in input_iter (IntPrioQueue.insert pq i i) with End_of_file -> pq | Scanf.Scan_failure (s) -> pq in let rec output_iter pq = try let prio, elt, new_pq = IntPrioQueue.extract pq in Printf.fprintf outstream "%d\n" elt ; output_iter new_pq with IntPrioQueue.Queue_is_empty -> () in output_iter (input_iter PrioQueue.empty) ;; main () ;; (* Makefile *) prioqueue: prioQueue.cmo prioQueue.cmi main.cmo ocamlc -o $@ prioQueue.cmo main.cmo prioQueue.cmo: prioQueue.ml prioQueue.cmi ocamlc -c prioQueue.ml prioQueue.cmi: prioQueue.mli ocamlc -c $^ main.cmo: main.ml ocamlc -c $^ clean: rm -Rf *.cm[oi] *~ При компиляции выдает следующее: ocamlc -c prioQueue.mli ocamlc -c prioQueue.ml ocamlc -c main.ml File "main.ml", line 18, characters 41-42: This expression has type int but is here used with type IntPrioQueue.priority = IntOrderedType.t make: *** [main.cmo] Ошибка 2 Спасибо.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум OCaml. Непонятки с модулями. (2006)
- Форум [школота-тред] синтаксис в Ocaml (2011)
- Форум ocaml, туплю (2005)
- Форум OCaml DFS algorithm implementation (2006)
- Форум эффекты в многоядерном окамле(как это работает?) (2017)
- Форум YYSTYPE Bison&Flex (2021)
- Форум Flex&Bisone конфликты (2020)
- Форум язычок вот написал (2020)
- Форум C / Базовые типы / 100 вопросов (2008)
- Форум modules problem (2001)