В ARCHI
нет декларации Add
.Конструктор Add
из M
должен быть записан M.Add
.Кроме того, как уже заметил Ашиш Агарвал , модуль ARCHI
может принимать аргумент, который не имеет конструктора Add
, поскольку в сигнатуре MOD
не упоминается ни один конструктор с именем Add
.
Если вы хотите использовать Add
в M
, вы должны объявить его при объявлении M
, то есть в аргументе конструктора.Один из способов сделать это - полностью указать тип op
в подписи MOD
:
module type MOD = sig
type operand
type op = Add of operand * operand| Sub of operand * operand
val print : op -> string
end;;
Если вы используете подпись MOD
для других целей, где тип op
долженоставайтесь абстрактными, есть примечание для добавления равенства типов в сигнатуру.При первоначальном определении MOD
вы можете написать
module type MOD_like_M1 =
MOD with type op = Add of operand * operand| Sub of operand * operand
module ARCHI = functor (M : MOD_like_M1) -> …
или
module type MOD_like_M1 = MOD with type op = M1.op
module ARCHI = functor (M : MOD_like_M1) -> …
или
module type MOD_like_M1 =
MOD with type op = Add of operand * operand| Sub of operand * operand
module ARCHI = functor (M : MOD with type op = M1.op) -> …
В любом случае, в определении ARCHI
, вам нужно open M
или написать M.Add
.