Types 接口中的子类型约束

Types 接口中的子类型约束,types,interface,ocaml,signature,subtype,Types,Interface,Ocaml,Signature,Subtype,我想在几个模块中组合几个“特征”。一个函数可能需要多个“特征”作为其输入,即: type 'a x_t = < get_x : int ; .. > as 'a constraint 'a = < get_b : float ; .. > val foo : x_t -> float type'a x\u t=作为“约束”a= val foo:x_t->float 在界面中手动编写这些特性既麻烦又容易出错,但这是完全可能的 但在理想情况下,我应该能够使用“tr

我想在几个模块中组合几个“特征”。一个函数可能需要多个“特征”作为其输入,即:

type 'a x_t = < get_x : int ; .. > as 'a constraint 'a = < get_b : float ; .. >
val foo : x_t -> float 
type'a x\u t=作为“约束”a=
val foo:x_t->float
在界面中手动编写这些特性既麻烦又容易出错,但这是完全可能的

但在理想情况下,我应该能够使用“trait”名称,而不是手动编写所有必需的字段,例如,编写如下内容:

 type 'a x_t = < get_x : int ; .. > as 'a constraint 'a <: a_t

type'a x\u t=作为“约束”a如果将特征定义为类类型而不是对象类型,则可以使用
#foo
语法

class type b = object
  method get_b : float
end

class type c = object
  method get_c : bool
end

type 'a x_t = < .. > as 'a 
  constraint 'a = #b
  constraint 'a = #c

(看起来类型太聪明了,但为什么不进行实验……

如果将特征定义为类类型而不是对象类型,则可以使用
#foo
语法

class type b = object
  method get_b : float
end

class type c = object
  method get_c : bool
end

type 'a x_t = < .. > as 'a 
  constraint 'a = #b
  constraint 'a = #c

(看起来有些人太聪明了,不适合自己,但为什么不尝试一下……

什么是特质?你是说界面?在OCaml中,所有类型的参数或函数都是自动推断的。你只需要使用,而不是定义“特质”的解释,见我的编辑上面。关于类型推断:我知道这个特性,但是为了模块性和可读性,我想为我的所有模块提供OCaml模块签名。我想你说的是OCaml中的函子。基本上,函子本身就是一个模块,可以作为参数提供给另一个模块。在这个目标模块中,它可以调用函子的函数。你最好用你的问题给出一个简洁的例子,这样我就可以用你的例子来演示函子了。否则,这里有一个很好的解读:什么是特质?你是说界面?在OCaml中,所有类型的参数或函数都是自动推断的。你只需要使用,而不是定义“特质”的解释,见我的编辑上面。关于类型推断:我知道这个特性,但是为了模块性和可读性,我想为我的所有模块提供OCaml模块签名。我想你说的是OCaml中的函子。基本上,函子本身就是一个模块,可以作为参数提供给另一个模块。在这个目标模块中,它可以调用函子的函数。你最好用你的问题给出一个简洁的例子,这样我就可以用你的例子来演示函子了。否则,这里有一个非常好的阅读:那么基本上“'a=#b”是类的子类型约束的语法?有关于这种语法的官方文档吗?规范似乎没有提到“#”类型运算符。在类
intlist
的定义中,3.11多态方法中首先提到了该符号。如果
b
是类类型,则
#b
是多态类型,其实例正是
b
的实例对象的类型。看
constraint'a=#b
只是
constraint'a=
的一个特例。所以基本上“'a=#b”是类上子类型约束的语法?有关于这种语法的官方文档吗?规范似乎没有提到“#”类型运算符。在类
intlist
的定义中,3.11多态方法中首先提到了该符号。如果
b
是类类型,则
#b
是多态类型,其实例正是
b
的实例对象的类型。看<代码>约束'a=#b
只是
约束'a=
的一个特例。