2009-09-15 28 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

爲了擴大這一點,建議您有一個默認結構(如未知(雅虎)建議),或使用該特定字段的選項類型。 – nlucaroni 2009-09-16 14:33:12

5

只是爲了讓newacct的回答更加清晰,這裏是一個例子

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

let choose_only_nucleus nucleus = 
    { default_syllable with nucleus = nucleus }