OCaml嵌套结构

Jay*_*Jay 1 ocaml types

我对OCaml很陌生,但我很好奇是否可以进行如下类型声明:

type some_type = {
  list_of_things: {
    amount: integer;
    date: string;
  } list;
};;
Run Code Online (Sandbox Code Playgroud)

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

oct*_*ron 7

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

type transaction = {
    amount: integer;
    date: string;
  }

type some_type = {
  list_of_things: transaction list;
}
Run Code Online (Sandbox Code Playgroud)

一个原因是OCaml类型系统是名义上的(在对象系统和模块系统之外):类型由它们的名称定义,而不是由它们的内容定义.因此,list_of_things需要定义列表元素的类型,即.在某个地方命名.

定义相互递归记录也是完全可能的:

type transaction = {
    amount: integer;
    date: string;
    other: some_type
  }

and some_type = {
  list_of_things: transaction list;
}
Run Code Online (Sandbox Code Playgroud)

从OCaml 4.03开始,还可以在sum类型的定义中定义内联记录类型,例如:

type tree = Leaf | Node of { left:tree; right:tree}
Run Code Online (Sandbox Code Playgroud)

但是,内联记录不是完全一流的,并且不能在其构造函数的上下文之外使用,因为它们缺少正确的名称.