我正在尝试学习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
无效。任何(我的意思是任何)帮助都表示赞赏。
答案 0 :(得分:6)
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 = <obj>
# x#doIt ;;
Doing something
- : unit = ()
答案 1 :(得分:1)
声明类型:
class myClass (foo:myClass2) =