OCaml: оставить поля в записях неопределенными? - PullRequest
4 голосов
/ 15 сентября 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

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

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

let choose_only_nucleus nucleus =
   { default_syllable with nucleus = nucleus }
3 голосов
/ 15 сентября 2009

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

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

1 голос
/ 06 сентября 2010

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

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, ...]}

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

...