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.

È stato utile?

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 = ()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top