Domanda
Sto tentando di imparare oCaml e sto riscontrando un problema per cui il seguente programma non è valido.
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'errore che ricevo quando provo a compilare il programma è:
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
Sono particolarmente interessato al perché:
val dMember = foo
method doIt = dMember#doSomething
non è valido. Qualsiasi aiuto (e intendo qualsiasi ) è apprezzato.
Soluzione
Dichiara il tipo:
class myClass (foo:myClass2) =
Altri suggerimenti
Gli oggetti OCaml non possono avere variabili di tipo libere nelle loro firme. Poiché il tipo di argomento foo
non è completamente specificato, è necessario parametrizzare myClass
dalle variabili libere nel tipo di 'a tree
.
class ['a] myClass foo =
object
val dMember = foo
method doIt : 'a = dMember#doSomething
end;;
Questa definizione ha il tipo
class ['a] myClass :
(< doSomething : 'a; .. > as 'b) ->
object val dMember : 'b method doIt : 'a end
È simile ai normali dataypes parametrizzati, ad es. 'a
(le parentesi attorno a foo#doSomething
sono solo un po 'di cruft sintattico). Si noti che <=> è il tipo di <=>, non di <=>.
# let x = new myClass (new myClass2);;
val x : unit myClass = <obj>
# x#doIt ;;
Doing something
- : unit = ()