2014-07-13 6 views
7

दो मल्टी-वे पेड़, t1 और टी 2 के लिए, का उपयोग करके परिभाषितहास्केल में पेड़ के बीच एक उपट्री कैसे स्थानांतरित करें?

type Forest a = [Tree a] 
data Tree a = Node { 
     rootLabel :: a,  
     subForest :: Forest a 
    } 

कैसे मैं एक समारोह है कि t1 से एक सबट्री हटाने और t2 में दिए गए नोड पर से जोड़ दिया जाएगा लिख ​​सकता है?

मैं कल्पना हस्ताक्षर की तरह

moveSubTree :: ((Tree x a) x (Tree x a)) -> (Tree x Tree) 

कुछ ऐसा दिखाई देगा यानी यह एक पेड़ और माता पिता के नोड एक सबट्री को परिभाषित करने लग जाते हैं हटा दिया जाना चाहिए, और एक दूसरे पेड़ और नोड कि जिस पर मूल डालने के लिए के बिंदु को परिभाषित सबट्री।

निकालने के लिए अलग-अलग फ़ंक्शन और फिर आवश्यक होने पर उपट्री को जोड़ा जा सकता है।

+5

'x' क्या है? इसके अलावा, हास्केल के पास कोई पॉइंटर्स नहीं है। एक पेड़ का मूल्य सिर्फ एक पेड़ है, कुछ भी नहीं। आपको पेड़ से उपट्री प्राप्त करने के लिए कुछ रास्ता प्रदान करना होगा, जैसे पथ (सूचकांक की एक सूची)। –

+1

आपको "टी 2 में दी गई गहराई में इसे डालने" से अधिक विशिष्ट होना होगा - किसी भी गहराई पर पेड़ में कई बिंदु हो सकते हैं, जिसे आप इसे स्थानांतरित करना चाहते हैं? –

+0

यह समझ में आता है - मुझे इसे "टी 2 में दिए गए नोड पर डालना चाहिए" होना चाहिए था। मैं इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट करूंगा। –

उत्तर

9

आप एक पेड़ में संपादन कर सकते हैं और "पथ पर" पढ़ सकते हैं।

data Dir = L | R 
type Path = [Dir] 
data Tree a = Leaf | Node a (Tree a) (Tree a) 

read :: Path -> Tree a -> Maybe (Tree a) 
read []  t = t 
read (s:ss) t = case t of 
    Leaf  -> Nothing 
    Node a l r -> case s of 
    L -> read ss l 
    R -> read ss r 

edit :: Path -> (Tree a -> Tree a) -> Tree a -> Maybe (Tree a) 
edit []  f t = Just (f t) 
edit (s:ss) f t = case t of 
    Leaf  -> Nothing 
    Node a l r -> case s of 
    L -> do 
     l' <- edit ss f l 
     return (Node a l' r) 
    R -> do 
     r' <- edit ss f r 
     return (Node a l r') 

और फिर एक और

cnp :: Path -> Path -> Tree a -> Maybe (Tree a) 
cnp readPath writePath t = do 
    subtree <- read readPath t 
    edit writePath (const subtree) t 

दिलचस्प बात यह है के लिए इस उपकरण "कॉपी और पेस्ट" एक पथ से subtrees आप कर सकते हैं का उपयोग कर, "पथ पर सबट्री" का निर्माण एक Lens जो इन दोनों के बीच सामान्य संरचना subsumes संचालन।

+2

एक नाबालिग नाइटपिक, टीएस एक मल्टीवे पेड़ चाहता था, बाइनरी नहीं। –

+2

सच है। यह विचार 'टाइप पथ = [इंट]' का उपयोग कर बहु-मार्ग पेड़ों को सामान्यीकृत करता है और यह नोट करता है कि पथ बहुत लंबे समय तक और एक अस्तित्व वाले उप-संदर्भ के संदर्भ में "मिस" कर सकते हैं। –

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