3

我正在尝试学习 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

是无效的。感谢任何(我的意思是任何)帮助。

4

2 回答 2

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 = ()
于 2009-01-26T05:08:26.537 回答
1

声明类型:

class myClass (foo:myClass2) =
于 2009-01-26T00:03:43.467 回答