我对OCaml很陌生,但我很好奇是否可能出现以下类型声明:
type some_type = {
list_of_things: {
amount: integer;
date: string;
} list;
};;
我确定我做错了什么,但只是想知道。谢谢!
答案 0 :(得分:7)
嵌套结构是完全可能的,但是在使用之前需要定义记录类型:
type transaction = {
amount: integer;
date: string;
}
type some_type = {
list_of_things: transaction list;
}
一个原因是OCaml类型系统是名义上的(在对象系统和模块系统之外):类型由它们的名称定义,而不是由它们的内容定义。因此,需要定义列表list_of_things
的元素的类型,即。在某个地方命名。
完全可以定义相互递归的记录:
type transaction = {
amount: integer;
date: string;
other: some_type
}
and some_type = {
list_of_things: transaction list;
}
从OCaml 4.03开始,还可以在和类型的定义中定义内联记录类型,例如:
type tree = Leaf | Node of { left:tree; right:tree}
但是,内联记录不是完全一流的,并且不能在其构造函数的上下文之外使用,因为它们缺少正确的名称。