Как связать итератор к набору в OCaml

У меня есть эти два класса в 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

И я должен создать два реальных класса ['a] queue подтип collection и ['a] iterator_queue подтип iterator.

Я хочу главным образом знать, как определить метод iterator : unit -> 'a iterator потому что я не вижу, как два типа могут быть соединены, Делает ['a] iterator_queue должен быть наследован от обоих абстрактные? или если я продолжаю двигаться по-другому.

5
задан Gilles 'SO- stop being evil' 16 September 2012 в 21:11
поделиться

2 ответа

Я подозреваю, что это может быть просто тестом на определение рекурсивных классов.

class ['a] queue = 
  object
    inherit 'a container
    method iterator = new iterator_queue args
    ...
  end
and ['a] iterator_queue args = 
  object
    ...
  end
1
ответ дан 14 December 2019 в 19:15
поделиться

Вероятно, самый простой способ сделать это - определить итератор как объект в рамках определения очереди (в Java это будет называться "внутренним классом"). Например:

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

Обратите внимание, что lst является ссылкой на (неизменяемое) значение q в момент вызова итератора. Последующие изменения очереди не будут отражены в итераторе.

4
ответ дан 14 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: