Я не совсем понимаю, что вы хотите здесь знать. Видимо, вы запутались в некоторых словах об обычных модулях и функторах OCaml и о более новых «модулях первого класса» OCaml. В любом случае, я даю вам небольшой рабочий пример с OCaml 4.00.1 (не пробуйте с 3.12.1, так как в 4 все улучшено), возможно, это поможет вам:
module type Arity = sig
val arity :int
end
module S = functor (A : Arity) -> struct
let check = A.arity = 2 (* or whatever *)
end
Вышесказанное - это то, что вы дали нам с некоторыми тривиальными исправлениями для компиляции. Обычно для использования проверки вы даете реализацию сигнатуры Arity и передаете ее функтору S:
module AR = struct
let arity = 3
end
module SAR = S(AR)
let () = Printf.printf "%b\n" SAR.check
Воспользуемся первоклассными модулями:
let a = (module AR : Arity)
Это преобразует модуль AR в значение и привяжет его к переменной a. Обратите внимание, что парные скобки являются обязательными для синтаксиса. Также нужно дать сигантуру Arity. Также можно написать так:
let a' : (module Arity) = (module AR)
Итак, тип a и a 'есть (модуль Arity), и вам нужно каким-то образом передать его компилятору. К сожалению, здесь нам не помогает вывод типов.
Вы можете вернуть значение в модуль следующим образом:
module A' = (val a)
Теперь вы также можете создать значение модуля первого класса для функтора S:
module type RESULT = sig
val check : bool
end
let s (a : (module Arity)) =
let module A = (val a) in
let module SA = S(A) in
(module SA : RESULT)
Что делает s: принимает значение, возвращает его в модуль, применяет к нему функтор S, а затем создает другое значение из результата применения функтора. Для преобразования необходим знак РЕЗУЛЬТАТ. Вы не можете писать (модуль SA: sig val check bool end). Я не очень разбираюсь в этом, но, как я слышал, типизация значений модуля первого класса является не структурной, а номинальной. Вам нужно дать имя подписи в (модуль M: X).
Тип s: (модуль Arity) -> (модуль RESULT). Применим s к:
let m = s a
Чтобы получить доступ к чеку внутри m, вам нужно вернуть его в модуль:
let m_check =
let module M = (val m) in
M.check
Вы можете быть разочарованы, увидев, что преобразование модуля значений ‹-> явное, но вот как это работает ...
person
camlspotter
schedule
25.03.2013