2009-09-15 4 views
4

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

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

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

ответ

1

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

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

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

3

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

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

+0

Чтобы развернуть это, рекомендуется, чтобы вы либо имели структуру по умолчанию (как предполагает неизвестность (yahoo)), либо используйте тип параметра для этого конкретного поля. – nlucaroni

5

Просто, чтобы сделать ответ newacct яснее, вот пример

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

let choose_only_nucleus nucleus = 
    { default_syllable with nucleus = nucleus }