OCaml使用嵌套类型

时间:2017-03-24 20:53:03

标签: types nested ocaml

我是OCaml的新手,我正试图进入一个大型的OCaml项目。在追踪构成其他类型的类型的过程中,我试图思考如何使用这些类型,所以我将其分解为一个小例子,我认为它与大型项目中的方式非常接近。

如果我的记录类型expression由三个字段组成:

type expression = {e_id:int; e_node:exp_node; e_loc:location}
and exp_node =
  | Const of int
  | Lval of lval
  | SizeofStr of string
and lval =
  | Var of varinfo
  | Mem of expression
and location = {x:int; y:int}
and varinfo = {vname:string; vorigname:string}

如果e_node字段是整数,我可以绑定此类型的变量:

let exp_const = {e_id=10;
                 e_node= Const 10;
                 e_loc={x=10; y=10}}

现在,如果我希望e_node字段属于Lval类型,即记录类型lval,我无法弄清楚如何执行此操作。我试过了:

let exp_lval_var =
  {e_id=11;
   e_node= {vname="int_val"; vorigname="int_val1"};
   e_loc={x=10; y=20}}

但它说This expression has type varinfo but an expression was expected of type exp_node。但如果你遵循这些类型,那就是!?

我在这里没有正确定义类型吗?或者我没有正确使用这些类型?我无法找到使用OCaml类型的更复杂的例子。这里的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

就像您撰写Const 10(而不仅仅是10)一样,您需要撰写Lval (Var { ... })以获得e_node字段的正确价值。< / p>

let exp_lval_var =
  {e_id=11;
   e_node= Lval (Var {vname="int_val"; vorigname="int_val1"});
   e_loc={x=10; y=20}}

要遵循第一个示例的类型:

  • 10的类型为int
  • Const 10的类型为exp_node

对于第二个例子

  • {vname="int_val"; vorigname="int_val1"}的类型为varinfo
  • Var {vname="int_val"; vorigname="int_val1"}的类型为lval
  • Lval (Var {vname="int_val"; vorigname="int_val1"})的类型为exp_node

ConstVarLval等值构造函数不仅仅是OCaml中文档的标签。它们必须作为表达式的一部分出现,以形成其类型的值。