OCaml

2010-01-02 12 views
5

में एक संग्रह के लिए एक इटरेटर संबद्ध करने के लिए कैसे मैं OCamlOCaml

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 

में इन दो वर्गों है और मैं दो ठोस वर्ग collection और ['a] iterator_queueiterator की एक उप प्रकार का ['a] queue उप प्रकार बनाना होगा।

मैं मुख्य रूप से यह जानना चाहता हूं कि iterator : unit -> 'a iterator विधि को कैसे परिभाषित किया जाए क्योंकि मुझे नहीं लगता कि दो प्रकार कैसे जुड़े जा सकते हैं, क्या ['a] iterator_queue दोनों अमूर्त लोगों से विरासत में होना चाहिए? या मैं अलग-अलग आगे बढ़ना चाहिए।

उत्तर

4

शायद ऐसा करने का सबसे आसान तरीका कतार की परिभाषा के दायरे में एक वस्तु के रूप में इटेटरेटर को परिभाषित करना है (जावा में, इसे "आंतरिक वर्ग" कहा जाएगा)। उदाहरण के लिए:

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 समय है कि iterator कहा जाता है पर q की (अपरिवर्तनीय) मूल्य के लिए एक संदर्भ है। कतार में बाद के परिवर्तन इटेटरेटर में दिखाई नहीं देंगे।

+1

मैंने जिस तरीके से सोचा था, वह एक ऐसा तरीका है, लेकिन यह एक परीक्षा का विषय है, जिसे मैं समाधान ढूंढने की कोशिश कर रहा हूं;) – 0xFF

1

मुझे संदेह है कि यह पारस्परिक रूप से पुनरावर्ती कक्षा परिभाषाओं का परीक्षण हो सकता है।

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