OCaml嵌套结构

4

我对OCaml还不太熟悉,但我很好奇是否可以使用以下类型声明:

type some_type = {
  list_of_things: {
    amount: integer;
    date: string;
  } list;
};;

我确定我做错了什么,但只是想知道。谢谢!

(这句话涉及个人疑问,需要根据上下文理解具体意思)
1个回答

8

嵌套结构是完全可行的,但记录类型需要在使用之前定义:

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开始,也可以在和sum类型定义中定义内联记录类型,例如:

type tree = Leaf | Node of { left:tree; right:tree}

然而,内联记录并非完全的一等公民,因为它们缺乏一个适当的名称,无法在其构造函数之外使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接