Обратите внимание на следующий код:
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, которая объясняет проблему и некоторые распространенные решения. То, что я не понимаю, является фактическим сообщением об ошибке:
- Что означает, что тип становится неизвестным?
- Что означает, когда поле не выбрано?
- И в результате двух выше: какие условия необходимо выполнить, чтобы игнорировать предупреждение?