2010-01-02 11 views
5

Ho queste due classi in OCamlCome associare un iteratore ad una collezione in OCaml

class type ['a] collection = 
    object 
    method add : 'a -> unit 
    method clear : unit -> unit 
    method iterator : unit -> 'a iterator 
    method remove : 'a -> unit 
    end 

class type ['a] iterator = 
    object 
    method hasNext : unit -> bool 
    method next : unit -> 'a 
    end 

E ho bisogno di creare due classi concrete ['a] queue sottotipo di collection e ['a] iterator_queue un sottotipo di iterator.

Voglio principalmente sapere come definire il metodo iterator : unit -> 'a iterator perché non vedo come i due tipi possono essere collegati, Il ['a] iterator_queue deve essere ereditato da entrambi quelli astratti? o dovrei procedere diversamente.

risposta

4

Probabilmente il modo più semplice per farlo è definire l'iteratore come un oggetto nell'ambito della definizione della coda (in Java, questa sarebbe chiamata una "classe interna"). Ad esempio:

class ['a] queue : ['a] collection = 
    object 
    val q = ref [] 

    (* definitions of add, clear, remove *) 

    method iterator() : 'a iterator = 
     object 
     val lst = ref !q 

     (* definitions of hasNext and next *) 

     end 
    end 

noti che lst è un riferimento al valore (immutabile) del q al momento iterator si chiama. Le modifiche successive alla coda non si rifletteranno nell'iteratore.

+1

Uno dei modi in cui ho pensato di farlo, ma questo è un argomento di un esame, che sto cercando di trovare la soluzione per;) – 0xFF

1

Sospetto che questo potrebbe semplicemente essere un test di definizioni di classi reciprocamente ricorsive.

class ['a] queue = 
    object 
    inherit 'a container 
    method iterator = new iterator_queue args 
    ... 
    end 
and ['a] iterator_queue args = 
    object 
    ... 
    end 
Problemi correlati