OCaml:记录中的字段是否未定义?

时间:2009-09-15 03:03:29

标签: ocaml record

我有这种记录类型:

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

如果我想要实例化仅定义核的音节怎么办?我可以给它一个默认值吗?是默认为[]还是类似的东西?

3 个答案:

答案 0 :(得分:6)

只是为了让newacct的答案更清晰,这是一个例子

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

let choose_only_nucleus nucleus =
   { default_syllable with nucleus = nucleus }

答案 1 :(得分:3)

不,我不认为你可以保留未定义的东西。未初始化的值会导致像C这样的语言中的各种问题,因此在OCaml中可以避免这种问题。 (虽然标准库中有一些函数可以保留一些未定义的函数,例如String.create,但我认为你不能自己做。)

您必须自己填写所有字段(并使用空列表[]或类似的内容来表示您不关心的值),或者使用此类型的预先存在的值并且使用记录更新语法创建一个新记录,其中包含您关注的字段已更改,而其他字段则从预先存在的记录中复制。

答案 2 :(得分: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, ...]}

认为这就是语法。