在接口子类型约束(Subtype constraints in interfaces)

2019-10-20 08:55发布

我想在几个模块组成几个“特征”。 函数可能需要多个这样的“特征”作为它的输入,即:

type 'a x_t = < get_x : int ; .. > as 'a constraint 'a = < get_b : float ; .. >
val foo : x_t -> float 

在界面上手动构成这些性状是麻烦的和容易出错的,但完全有可能。

但是,在一个理想的世界,我应该能够使用“特性的”名称,而不是人工合成所需的所有领域,即写类似:

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

不幸的是,OCaml的语法不允许这样。 这似乎是一个纯粹的语法限制,所以我不知道是否有这个更深层次的原因?

换句话说:为什么我不能直接写在OCaml的类型签名子类型约束?

编辑:澄清用例:我有一些共同的共享状态提供功能几个(有时相互依存的)模块。 这些模块应是可组合和松散耦合(即只要求他们的全局状态的一部分,以满足他们的需求,因此,我可以随时扩展新的功能的状态)。 为了实现这一目标,该状态被封装在其中提供了多个透镜(以上我只使用了吸气剂,而不是设置器)的对象。 因此,如果我为模块提供接口定义我需要通过对编码整个状态类型的类型参数约束来描述在我的函数签名所需要的透镜。 现在我正在寻找一种方式来写这些组成签名要求尽量短的读出来。

Answer 1:

如果定义,而不是对象类型的性状类类型,你可以使用#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

您也可以通过继承机制构成特点:

class type e = object
  inherit b inherit c
end

(貌似是为自己好太聪明的类型,但为什么不尝试...)



文章来源: Subtype constraints in interfaces