2009-01-25 41 views
3

我正在嘗試學習oCaml,並且遇到問題,爲什麼下面的程序無效。基本OCaml OOP問題

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 

是無效的。任何(我的意思是任何)幫助表示讚賞。

回答

1

聲明類型:

class myClass (foo:myClass2) = 
+0

這不會破壞在myClass.doIt方法中使用結構類型的目的嗎? – Juliet 2009-01-26 00:12:24

6

OCaml的對象不能有自由類型變量在他們的簽名。由於自變量foo的類型未完全指定,因此需要使用foo類型的自由變量來參數化myClass

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 

這類似於正常參數dataypes,例如,'a tree(該'a圍繞托架是隻是有點句法的cruft)。請注意0​​是foo#doSomething的類型,而不是foo

# let x = new myClass (new myClass2);; 
val x : unit myClass = <obj> 
# x#doIt ;; 
Doing something 
- : unit =()