2010-01-02 8 views
5

tengo estas dos clases de OCamlCómo asociar un iterador a una colección en 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 

Y tengo que crear dos clases concretas ['a] queue subtipo de collection y ['a] iterator_queue un subtipo de iterator.

Quiero saber principalmente cómo definir el método iterator : unit -> 'a iterator porque no veo cómo se pueden conectar los dos tipos, ¿Se debe heredar el ['a] iterator_queue tanto de los abstractos? o debería proceder de manera diferente.

Respuesta

4

Probablemente la forma más fácil de hacerlo es definir el iterador como un objeto dentro del alcance de la definición de la cola (en Java, esto se denominaría una "clase interna"). Por ejemplo:

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 

Tenga en cuenta que lst es una referencia al valor (inmutable) de q en el momento que se llama iterator. Los cambios posteriores en la cola no se reflejarán en el iterador.

+1

Una de las formas en que pensé que lo estaba haciendo, pero esto es un tema de un examen, que estoy tratando de encontrar la solución para;) – 0xFF

1

Sospecho que esto podría ser simplemente una prueba de definiciones de clase mutuamente recursivas.

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