如何将迭代器与OCaml中的集合相关联

时间:2010-01-02 22:42:24

标签: class collections iterator 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是否必须从两个类型中继承?或者我应该采取不同的行动。

2 个答案:

答案 0 :(得分:4)

可能最简单的方法是将迭代器定义为队列定义范围内的对象(在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

请注意,lstqiterator被调用时对(不可变)值的引用。对队列的后续更改不会反映在迭代器中。

答案 1 :(得分:1)

我怀疑这可能仅仅是对相互递归类定义的测试。

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