2009-01-25 6 views
3

J'essaie d'apprendre oCaml et j'ai un problème quant à la raison pour laquelle le programme ci-dessous n'est pas valide.Question OAM de base 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;; 

L'erreur que je reçois en essayant de compiler le programme est le suivant:

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 

Je suis particulièrement intéressé de savoir pourquoi:

val dMember = foo 
method doIt = dMember#doSomething 

est invalide. Toute aide (et je veux dire ) est appréciée.

Répondre

1

Déclare le type:

class myClass (foo:myClass2) = 
+0

Est-ce que cela ne viendrait pas à l'encontre de l'utilisation du typage structurel dans la méthode myClass.doIt? – Juliet

6

objets OCaml ne peuvent pas avoir des variables de type libre dans leurs signatures. Étant donné que le type de l'argument foo n'est pas entièrement spécifié, vous devez paramétrer myClass par les variables libres dans le type foo.

class ['a] myClass foo = 
object 
val dMember = foo 
method doIt : 'a = dMember#doSomething 
end;; 

Cette définition a le type

class ['a] myClass : 
    (< doSomething : 'a; .. > as 'b) -> 
    object val dMember : 'b method doIt : 'a end 

Ceci est similaire à dataypes paramétrées normales, par exemple, 'a tree (les parenthèses autour du 'a sont juste un peu de cruft syntaxique). Notez que 'a est le type de foo#doSomething, pas de foo.

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