2016-06-05 6 views
4

У меня естьКак включить работу?

module type T = sig 
    type t 
end 

и

module Make (TypeProvider : T) = struct 
    include TypeProvider 
    type d = Wrapped of t 
end 

и

module Test = struct 
    include Make (struct type t = ForWrap end) 
    let f = function | Wrapped ForWrap ->() 
end 

я представлял тест после компиляции, как

module Test = struct 
    type t = ForWrap 
    type d = Wrapped of t 
    let f = function | Wrapped ForWrap ->() 
end 

Но в реале, это не компилируется с ода. OCaml говорит мне:

module Test = struct 
    include Make (struct type t = ForWrap end) 
    let f = function | Wrapped ForWrap ->() 
           ^^^^^^^ 

Error: Unbound constructor ForWrap

end 

И я не могу понять, почему. В чем проблема в моем решении?

+0

functor application - это операционная среда, и вы не можете рассматривать '' include'' как чистую замену синтаксического уровня – objmagic

ответ

6

Давайте посмотрим подпись Make (struct type t = ForWrapp end):

module M = Make(struct type t = ForWrapp end) 

ocamlc -c -i xxx.ml показывает подпись этого модуля:

module M : sig 
    type t 
    type d = Wrrapped of t 
end 

Обратите внимание, что конструктор ForWrapp не доступен в модуле результата. Вот почему ваш код не проверяет тип.

Почему конструктор ушел? Это связано с тем, что аргумент аргумента функции Make равен T. T определяет тип t, который является абстрактным. Даже если вы примените Make к модулю с более подробной подписью (здесь struct type t = ForWrapp end), он будет сведен к T, и информация о конструкторе будет потеряна.

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

  • Нет связанных вопросов^_^