OCaml: оставить поля в записях неопределенными?

У меня есть этот тип записи:

type syllable = {onset: consonant list; nucleus: vowel list; coda: consonant list};;

Что если я захочу создать слог, в котором определено только ядро? Могу ли я дать ему значение по умолчанию? По умолчанию это [] или что-то в этом роде?

3 ответа

Решение

Я думаю, что лучше использовать "необязательные" поля.

type syllable = {onset: consonant list option; nucleus: vowel list option; coda: consonant list option};;

Таким образом, вы можете определить, что вам нужно.

{onset = Some [consonant, consonant, ...],
 nucleus = None,
 coda = Some [consonant, consonant, consonant, ...]}

Я думаю, что это синтаксис.

Чтобы прояснить ответ newacct, вот пример

let default_syllable = { onset = []; nucleus = []; coda = [] }

let choose_only_nucleus nucleus =
   { default_syllable with nucleus = nucleus }

Нет, я не думаю, что вы можете оставить вещи неопределенными. Неинициализированные значения вызывают всевозможные проблемы в таких языках, как C, и поэтому их избегают в OCaml. (Хотя в стандартной библиотеке есть несколько функций, которые оставляют некоторые вещи неопределенными, например, String.createЯ не думаю, что вы можете сделать это самостоятельно.)

Вы должны будете либо заполнить все поля самостоятельно (и использовать пустой список [] или что-то подобное для значений, которые вас не волнуют), или используйте уже существующее значение этого типа и используйте синтаксис обновления записи, чтобы создать новую запись с измененными полями, которые вам нужны, а остальные скопировать из предсуществующая запись.

Другие вопросы по тегам