Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class OCaml中具有类似字段的记录_Class_Types_Ocaml_Record - Fatal编程技术网

Class OCaml中具有类似字段的记录

Class OCaml中具有类似字段的记录,class,types,ocaml,record,Class,Types,Ocaml,Record,作为回答,建议将元信息“附加”到类型的方法是使用记录: type _foo = ... and foo = {n:_foo; m:meta} 但是如果我有多个类型想要用元信息包装呢?显然,记录类型中的所有字段名称都必须具有不同的名称,并且写入: type _foo = ... and foo = {n:_foo; m:meta} ... type _fooX = ... and fooX = {nX:_fooX; mX:meta} 似乎多余:/。类是解决这个问题的唯一方法吗?如果可能的

作为回答,建议将元信息“附加”到类型的方法是使用记录:

type _foo = ... 
and foo = {n:_foo; m:meta}
但是如果我有多个类型想要用元信息包装呢?显然,记录类型中的所有字段名称都必须具有不同的名称,并且写入:

type _foo = ... 
and foo = {n:_foo; m:meta}
...
type _fooX = ... 
and fooX = {nX:_fooX; mX:meta}

似乎多余:/。类是解决这个问题的唯一方法吗?如果可能的话,我希望避免处理类。

您可能可以使用参数化类型

type 'a wrapped = { base: 'a; extra: meta }

Jeffrey的解决方案是正确的,可以完美地扩展到递归类型

type location
type 'a loc = { a : 'a; loc : location }

type exp = Int of int | Add of exp loc * exp loc
仍然可以使用类型的前两次定义, 详情如下:

type exp_data = Int of int | Add of exp * exp
and exp = exp_data loc
最后,一种稍有不同的风格是使用“开放递归”,即只定义一个带有自由参数而不是递归出现的“取消递归类型”
open\u exp
。然后,您可以通过获取不动点来获取递归类型;您可以采用不同的固定点,一个没有附加信息,另一个位置交错。这是一种在递归站点插入信息的通用构造,其术语级对应项允许在递归函数中编织不同的内容(记忆、分析、调试等)


如果我的类型是递归的,如果没有一个具体的例子,很难说你想要什么。上面的
wrapped
类型将包装任何类型,无论它是递归的还是非递归的。如果希望在类型
'a
meta
类型之间递归,则可能需要另一个类型参数。也许您希望
meta
本身是一个参数化类型?尽量保持简单!例如:
type exp=BinOp exp*op*exp | Const of int
,我希望子表达式也用
meta
包装。如果您想用一种可以变化的类型注释树的所有节点,我想您可能必须在设计节点时考虑注释。因此,您将拥有一个可以由注释参数化的节点类型,而不是向类型添加注释的包装器(如上所述)。而不是
exp
您将拥有
'a exp
。我不认为有一种自动方式可以将此参数化添加到现有类型(很高兴被证明是错误的)。
type 'e open_exp = Int | Add of 'e * 'e
type simple_exp = Simple of simple_exp open_exp
type located_exp = Loc of located_exp loc open_exp