4

考虑以下小的 ocaml 类层次结构:

class x = object method i = 0 end ;;
class y = object method x = new x end ;;
class x2 = object method i = 0 method j = 1 end ;;
class z = object method x = new x2 inherit y end;; (* type error *)

我想要实现的是细化wrt的领域x,并在 z 的类型上看到细化,即class zclass y

class z = object method x = (new x2 :> x) inherit y end;; 
(new z)#x#j;; (* type error *)

不是想要达到的。

我非常有信心有一种方法可以说服类型检查器对改进的兼容性,但是如何呢?

4

1 回答 1

3

看起来很难直接做到这一点:如果您尝试method xy使用类型参数时放松类型,

class ['a] y = object
  constraint 'a = #x
  method x = new x
end

您可以看到类型检查器强制'a完全正确 x,而不是任何子类型#xx

class ['a] y = object
  constraint 'a = x
  method x = new x
end

因此,这将排除任何method x用另一种类型重新定义的尝试。但是,可以定义期望类型对象作为参数的类,并从它们#x派生出原始对象:class yclass z

class x = object method i = 0 end ;;

class ['a] y_gen (x:'a) = object
  constraint 'a = #x
  method x = x end
;;

class y = object inherit [x] y_gen (new x) end

class x2 = object method i = 0 method j = 1 end ;;

class ['a] z_gen (x:'a) = object
  constraint 'a = #x2
  inherit ['a] y_gen x
  method! x = x 
end;;

class z = object inherit [x2] z_gen (new x2) end

此外,z确实是 的子类型y,即以下内容已正确进行类型检查:

let my_z = new z
let my_y = (my_z :> y)
于 2014-09-05T15:46:09.747 回答