我正在尝试学习oCaml,并且我遇到了以下程序无效的问题.
class myClass2 = object method doSomething = Printf.printf "%s\n" "Doing something" end;; class myClass foo = object val dMember = foo method doIt = dMember#doSomething end;; let mc2 = new myClass2;; let mc = new myClass mc2;; mc#doIt;;
我在尝试编译程序时收到的错误是:
File "sample.ml", line 6, characters 5-84: Some type variables are unbound in this type: class myClass : (< doSomething : 'b; .. > as 'a) -> object val dMember : 'a method doIt : 'b end The method doIt has type 'a where 'a is unbound
我特别感兴趣的原因是:
val dMember = foo method doIt = dMember#doSomething
是无效的.任何(我的意思是任何)帮助表示赞赏.
OCaml对象的签名中不能包含自由类型变量.由于参数的类型foo
未完全指定,因此需要myClass
通过类型中的自由变量进行参数化foo
.
class ['a] myClass foo = object val dMember = foo method doIt : 'a = dMember#doSomething end;;
这个定义有类型
class ['a] myClass : (< doSomething : 'a; .. > as 'b) -> object val dMember : 'b method doIt : 'a end
这类似于普通的参数化数据表,例如,'a tree
(括号周围的括号'a
只是语法上的一点点).请注意,这'a
是类型foo#doSomething
,而不是foo
.
# let x = new myClass (new myClass2);; val x : unit myClass =# x#doIt ;; Doing something - : unit = ()