Что означает предупреждение 40: эта запись ... содержит поля, которые не видны в текущей области видимости
Пожалуйста, рассмотрите следующий код:
module A =
struct
type r = { i : int; s: string }
end
module B =
struct
type r = { i : int; s : string }
end
let f (x : A.r) : B.r = match x with
{ i; s } -> { i = 2*i; s = "" }
Два модуля определяют одну и ту же запись. Функция f преобразует запись A в запись B. Предупреждение уже генерируется во время компиляции, но также отображается в интерактивном режиме. В ocaml cli кажется, что вызов f делает то, что нужно:
# let x = f { i = 5; s = "ab" };;
Characters 10-29:
let x = f { i = 5; s = "ab" };;
^^^^^^^^^^^^^^^^^^^
Warning 40: this record of type Shadow.A.r contains fields that are
not visible in the current scope: i s.
They will not be selected if the type becomes unknown.
val x : Shadow.B.r = {Shadow.B.i = 10; s = ""}
Я нашел запись в блоге наlexifi.com которая объясняет проблему и некоторые общиерешения, Что я не понимаю, так это фактическое сообщение об ошибке:
Что это значит, что тип становится неизвестным?Что это значит, когда поле не выбрано?И в результате двух вышеупомянутых: какие условия должны быть выполнены, чтобы игнорировать предупреждение?