Sintassi OCaml per il passaggio di oggetti personalizzati come parametri
Domanda
Sto cercando di capire la sintassi del linguaggio OCaml e ho qualche problema con l'applicazione di alcune strutture OOP. Il mio obiettivo con il codice seguente è quello di avere una barra di classe che eredita da un foo di classe virtuale. La classe virtuale contiene tre metodi virtuali che spero di prendere un'istanza di un & Quot; player & Quot; oggetto come parametro. Quando compilo il codice seguente, viene visualizzato l'errore: Il metodo doThis ha tipo 'a - & Gt; 'b ma dovrebbe avere un giocatore di tipo. Cosa significa (ricorda, sono nuovo in questo) e come posso correggerlo?
Grazie!
class player =
object
end;;
class virtual foo =
object (self)
method virtual doThis : player
method virtual doThat : player
method virtual notifyAll : player array
end;;
class bar (playersIn: player array) =
object (self)
inherit foo
method doThis (p:player) = Printf.printf "%s\n" "This!"
method doThat (p:player) = Printf.printf "%s\n" "That!"
method notifyAll (p:player array) = Printf.printf "%s\n" "Notifying!"
end;;
Soluzione
(Non conosco OCaml, ma conosco F # e sono simili, quindi speriamo di indovinare.)
Prova a cambiare
method virtual doThis : player
method virtual doThat : player
method virtual notifyAll : player array
a
method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit
Altri suggerimenti
Credo che la risposta precedente sia corretta: i metodi in questione hanno bisogno che i loro tipi siano funzioni che restituiscono unità.
Un altro consiglio più generale: non iniziare ad imparare OCaml iniziando a imparare il sistema di oggetti. Gli oggetti in OCaml possono essere utili, ma i casi in cui si desidera veramente programmare con oggetti sono pochi e lontani tra loro. E non sarai in grado di comprendere il sistema a oggetti di OCaml fino a quando non avrai una buona conoscenza del linguaggio principale. Concentrati su come risolvere i tuoi problemi utilizzando tipi di dati algebrici di base (varianti, tuple, record), polimorfismo parametrico ordinario (al contrario del sottotipo che vedi con varianti e oggetti polimorfici) e moduli (ma non funzioni).
Comprendi questi strumenti di base prima di giocare con gli oggetti. La maggior parte dei problemi che risolveresti con oggetti in altre lingue sono risolti meglio in OCaml senza di essi.