Запись с необязательными и изменяемыми полями

В документах: https://bucklescript.github.io/docs/en/object.html есть примеры записи с изменяемыми и необязательными полями. Когда я пытаюсь использовать оба, это не удается:

Компилирует:

type person = {
  mutable age: int;
  job: string;
} [@@bs.deriving abstract]

let joe = person ~age:20 ~job:"teacher"
let () = ageSet joe 21

Добавляем атрибут [@bs.optional]:

type person = {
  mutable age: int;
  job: string [@bs.optional];
} [@@bs.deriving abstract]

let joe = person ~age:20 ~job:"teacher"
let () = ageSet joe 21

Сообщение об ошибке:

Строка 7, 20: Это выражение имеет тип unit -> person, но ожидалось выражение типа person

Строка 7 — это строка ageSet.

Я что-то пропустил здесь?


person kunigami    schedule 24.06.2018    source источник


Ответы (1)


Я перечитал документацию и пропустил эту часть

Примечание: теперь, когда ваша функция создания содержит необязательные поля, мы предписываем немаркированный () в конце, чтобы указать, что вы завершили применение функции.

type person = {
  mutable age: int;
  job: string [@bs.optional];
} [@@bs.deriving abstract]

let joe = person ~age:20 ~job:"teacher" ()
let () = ageSet joe 21
person kunigami    schedule 24.06.2018
comment
Функции Ocaml требуют, чтобы последний аргумент всегда был необязательным. Поэтому, когда у вас есть функция, в которой это не так, общее решение состоит в том, чтобы добавить фиктивный аргумент единицы измерения. У bs.Optional нет другого выбора, кроме как сделать это здесь. - person Goswin von Brederlow; 28.06.2018