2012-08-26 6 views
9

मैं Huet Zipper पढ़ रहा हूँ अंदर नेविगेट करने के लिए कैसे, मैं go_up विधि समझ में नहीं कर सकते हैं:एक HUET जिपर

let go_up (Loc(t,p)) = match p with 
Top -> failwith "up of top" 
| Node(left,up,right) -> Loc(Section((rev left) @ (t::right)),up);; 

अन्य प्रकार के पूर्ण स्रोत परिभाषाओं, लिंक किए गए पत्र में पाया जा सकता है अगर आप समझते हैं जिपर , मुझे लगता है कि मेरे प्रश्न का उत्तर देना कोई फर्क नहीं पड़ता।

जो मुझे जिपर के बारे में पता है, Location में वर्तमान नोड और Path या तथाकथित Context शामिल है। Path में वर्तमान नोड और उसके उपन्यासों के अलावा अन्य कुछ भी है, या कुछ लोगों ने इसे a one-hole-context कहा है।

ठीक है, फोकस ऊपर ले जाना, इसका मतलब है कि वर्तमान नोड का मूल नोड नया वर्तमान नोड बन जाएगा। लेकिन यहां, लेखक वर्तमान नोड्स और उसके भाई बहन को जोड़ता है। लेकिन यह माता-पिता नोड नहीं है, केवल माता-पिता नोड के बच्चे हैं। स्कैला में अपनी खुद की चालअप विधि को लागू करते समय मैं यहां पर फंस गया हूं, और वर्तमान नोड के मूल नोड का सही ढंग से प्रतिनिधित्व करने में विफल रहा हूं।

+0

आपको मेरा पूर्व एन-आरी जिपर कार्यान्वयन से प्रेरणा मिल सकती है: http://gist.github.com/3477576 – ron

+0

@ron आपका संदर्भ हमेशा माता-पिता नोड डेटा का संदर्भ रखता है, इस पेपर से संदर्भ 'टी। मैंने माता-पिता के संदर्भ को रखने के बजाय दूसरों को देखा है, वे एक अभिभावक स्थान रखते हैं, जो आपको माता-पिता नोड तक पहुंचने का मौका भी देता है। – Sawyer

+0

यदि आप किसी अन्य भाषा में पोर्टिंग करते हैं तो आपको परवाह नहीं है, लेकिन 'rev foo @ bar' को' List.rev_append foo bar 'लिखा जाने से लाभ होगा, जो दो बार की बजाय एक बार' foo' को पार करेगा। वास्तविक पेरेंट नोड का उत्पादन करने के लिए – gasche

उत्तर

5

ज़िपर यहाँ निम्नलिखित पेड़ डेटाप्रकार के लिए है:

type tree = 
    Item of item 
| Section of tree list;; 

और कागज से पथ डेटाप्रकार यह है:

type path = 
    Top 
| Node of tree list * path * tree list;; 

Node तीन घटक शामिल हैं। छेद के बाईं ओर स्थित माता-पिता नोड के बच्चे (left), पथ आगे बढ़ता है (up), और छेद के दाईं ओर स्थित पैरेंट नोड के बच्चे (right)।

जब ऊपर जा रहा है, ताकि वास्तविक माता पिता नोड का निर्माण करने के लिए, हम left और right के बीच में सही स्थिति में पुराने पेड़ t में प्लग करने के लिए है। चूंकि बाईं ओर के बच्चों को रिवर्स ऑर्डर में संग्रहीत किया जाता है, इसलिए हमें पहले उन्हें उलटना होगा।

+0

', हमें बाएं और दाएं के बीच में सही स्थिति में पुराने पेड़ टी को प्लग करना होगा। लेकिन बाएं और दाएं के बीच सही स्थिति में प्लगइन टी, केवल माता-पिता के माता-पिता का उत्पादन करें, माता-पिता नहीं। मुझे पता है कि अनुभाग पेड़ का प्रकार है, लेकिन इसका मतलब यह नहीं है कि यदि आप एक एकल पैरेंट नोड से नेविगेट करते हैं, और फिर आप नेविगेट करते हैं, तो आपको नोड्स का एक अनुभाग पैरेंट नोड के रूप में मिलता है। – Sawyer

+0

@ सायर अगर आप नीचे उतरते हैं तो आपको 'सेक्शन' मिलता है, क्योंकि एकमात्र अन्य विकल्प 'आइटम' होगा, लेकिन 'आइटम' में कोई बच्चा नहीं है, इसलिए आप पहले स्थान पर नहीं जा सकते थे। – gasche

+0

@ सॉयर जैसा कि गैसचे अपने दूसरे उत्तर में कहता है, बच्चों की सूची की तुलना में 'पेड़' की इस परिभाषा में नोड के लिए और कुछ भी नहीं है। अगर हम माता-पिता नोड के बच्चों की सूची का पुनर्निर्माण कर सकते हैं, तो हम इसे 'धारा'' लागू करके माता-पिता नोड को भी पुनर्निर्माण कर सकते हैं। (ध्यान दें कि यह एक कार्यात्मक सेटिंग में होता है; कोई वस्तु पहचान नहीं है।) – kosmikus

2

लेखक वर्तमान नोड्स और उसके भाई बहनों को जोड़ता है। लेकिन यह एक माता पिता नोड नहीं है, सिर्फ माता पिता नोड

कागज परिभाषा kosmikus द्वारा उद्धृत के साथ के बच्चों, एक गैर पत्ती नोड Section अपने बच्चों के अलावा अन्य कुछ भी नहीं द्वारा परिभाषित किया गया है। यदि आपने अतिरिक्त जानकारी जोड़ दी है, तो आपको इसे जिपर की परिभाषा में जोड़ना होगा।

संबंधित मुद्दे