2013-12-02 4 views
3

Почему, учитывая:Синтаксис сахара OCaml функторов

module type ENTRY = sig type t end  
module type LOG = functor (E : ENTRY) -> sig type t end 

Это правильное выполнение LOG

module Log :LOG = functor (LogEntry : ENTRY) -> 
    struct type t = LogEntry.t list end 

Но это не

module Log (LogEntry: ENTRY) :LOG = struct 
type t = LogEntry.t list end 

Error: Signature mismatch:                            
Modules do not match: sig type t = LogEntry.t list end is not included in LOG 

Если удалить метка sig (: LOG) из обоих определений Log, то они возвращают тот же тип, что и только синтаксический сахар [1]

[1] http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora132.html

+0

с использованием компилятора OCaml версии 4.01.0 – Heidi

ответ

3

Сообщение об ошибке сбивает с толку, но причина, по которой проходит первый пример, а второй не может на самом деле очень просто. Сравните:

type entry = int 
type log = int -> string 
let log : log = fun s -> string_of_int s 

и

let log (s : entry) : log = string_of_int s 

Сообщение об ошибке в случае модулей утверждает, что поле модуль не входит в функтор, так как ип-прикладному функтор не имеет полей.

ETA: функтор логически не может иметь полей: функции/функторы - «разные виды зверей», чем структуры данных/модули. - Это делает сообщение об ошибке запутанным, похоже, нас попросят ввести поле, хотя оно уже присутствует в результат функтора.

2

Позвольте мне уточнить на lukstafi ответ. LOG - это тип функтора, в первом случае он сопоставляется с самой реализацией самой реализации (которая действительно является функтором), но во втором случае она сопоставляется с результатом приложения-функтора (что бывает обычный модуль), следовательно, несоответствие.

В целом это похоже на непонимание синтаксиса. Внимательно прочитайте section on module types in the manual.

Смежные вопросы