У меня есть два файла: gadt1.ml и gadt2.ml, а второй зависит от первого.Как использовать GADT для модулей в OCaml без предупреждения?
gadt1.ml:
type never
type _ t1 = A1 : never t1 | B1 : bool t1
type _ t2 = A2 : string t2 | B2 : bool t2
let get1 : bool t1 -> bool = function B1 -> true
let get2 : bool t2 -> bool = function B2 -> true
gadt2.ml:
let get1 : bool Gadt1.t1 -> bool = function Gadt.B1 -> true
let get2 : bool Gadt1.t2 -> bool = function Gadt.B2 -> true
, когда я компилирую с помощью OCaml 4.02.3 (ocamlbuild gadt2.native
), я получаю предупреждение 8 о функции Gadt2.get1 не будучи исчерпывающим. Я довольно озадачен тем, что Gadt2.get1
вызывает предупреждение, а Gadt1.get1
и Gadt2.get2
- нет.
Мое предположение заключалось в том, что пустой тип never
не может быть равен bool
, поэтому Gadt2.get1
не должен вызывать предупреждение. С другой стороны, если я вызываю Gadt2.get1
с аргументом A1
, я получаю ошибку типа (по желанию). Является ли предупреждение ожидаемым поведением или ошибкой? Что я упустил?
Кстати, добавление -principal
к флагам компиляции ничего не меняет.
Я подозреваю, что это ошибка. Вы должны задать вопрос в списке рассылки caml-list. Кто отвечает за OCaml GADT, не смотрит ТАК. – camlspotter