3 Stimmen

Grundlegende OCaml OOP Frage

Ich versuche, oCaml zu lernen und habe ein Problem, warum das folgende Programm ungültig ist.

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;;

Die Fehlermeldung, die ich erhalte, wenn ich versuche, das Programm zu kompilieren, lautet:

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

Mich interessiert vor allem die Frage, warum:

val dMember = foo
method doIt = dMember#doSomething

ist ungültig. Jeder (und ich meine jede ) Hilfe ist erwünscht.

6voto

Chris Conway Punkte 54023

OCaml-Objekte können keine Variablen vom freien Typ in ihren Signaturen haben. Da der Typ des Arguments foo nicht vollständig angegeben ist, müssen Sie die Parameter myClass durch die freien Variablen im Typ von foo .

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

Diese Definition hat den Typ

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

Dies ist ähnlich wie bei normalen parametrisierten Datentypen, z. B., 'a tree (die Klammern um die 'a sind nur ein bisschen syntaktischer Ballast). Beachten Sie, dass 'a ist der Typ von foo#doSomething , nicht von foo .

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

1voto

Jules Punkte 6239

Deklarieren Sie den Typ:

class myClass (foo:myClass2) =

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X