Типы вариантов как ограничения сигнатур модулей / функторов в ocaml
Я пытаюсь использовать модули / функторы, чтобы иметь более общий дизайн кода. Для упрощения у меня есть два интерфейса:
module type T1 = sig type t end;;
module type T2 = sig type t end;;
и я хотел бы так создать T2.t
с типом варианта на основе T1.t
,
(* simple example, this one is accepted *)
module OK (T: T1) : (T2 with type t = T.t) = struct type t = T.t end;;
(* using a variant type, this one is rejected *)
module KO (T: T1) : (T2 with type t = X | Y of T.t) = struct
type t = X | Y of T.t
end
В последнем я получаю следующие ошибки:
Unbound module X
Syntax error inside `module' after unclosed (, expected `.'
Однако, если я использую полиморфные варианты, это, кажется, будет принято:
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = [ `X | `Y of T.t ]
end
но я явно не понимаю почему. Как правильно использовать такие ограничения с вариантами?
PS: обратите внимание, что этот также отклонен
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = X | Y of T.t
end
1 ответ
При ограничении модуля with type t = ...
, вы не можете писать определения типов, но выражения типа.
X | Y of T.t
является rhs определения варианта варианта, поэтому он отклоняется как синтаксическая ошибка. С другой стороны, [ `X | `Y of T.t]
это выражение типа.
Если вы не уверены в разнице между обычными и полиморфными вариантами, обратитесь к книгам OCaml или справочному руководству.
То, что вы хотите написать, может быть
module type T3 = sig
type t'
type t = X | Y of t'
end
module KOX (T: T1) : (T3 with type t' := T.t) = struct
type t = X | Y of T.t
end