В OCaml имена полей в типах записей должны быть уникальными, поэтому два определяемых вами типа не могут сосуществовать одновременно. Caml - единственный язык, на котором я знаю это свойство.
Поскольку второе определение скрывает первое, когда компилятор видит поля a и b, он ожидает, что они принадлежат типу fooConBar
, и поэтому жалуется на отсутствующее поле bar.
Если вы пытаетесь смоделировать интерфейс, правильный функциональный способ сделать это в Caml - определить module type
.
module type FOO_CON_BAR = sig
val a : string
val b : int
val bar : char
end
И экземпляр:
module Example = struct
let a = "hello"
let b = 99
let c = '\n'
end
С модулями и типами модулей вы также получаете подтипы; нет необходимости прибегать к объектам.
P.S. Мой Caml ржавый; синтаксис может быть отключен.