我是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类型的更复杂的例子。这里的任何建议将不胜感激。
答案 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
Const
,Var
和Lval
等值构造函数不仅仅是OCaml中文档的标签。它们必须作为表达式的一部分出现,以形成其类型的值。