Типы вариантов как ограничения сигнатур модулей / функторов в 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
Другие вопросы по тегам