data Tree a = Tree a [Tree a]
ध्यान दें कि हम खाली पेड़ की अनुमति नहीं है, और एक पत्ता उपतरू के एक खाली सूची के साथ एक पेड़ है।Haskell गुना आपरेशन
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
उपरोक्त जानकारी को देखते हुए, मुझे समझ नहीं आता कैसे पेड़ गुना समारोह रिकर्सिवली subtrees को गुना आपरेशन लागू करने के लिए, तो जड़ और परिणाम पर लेबल के लिए समारोह लागू करके किसी परिणाम देता है subtrees से वापस आ गया।
मैं भी नहीं मिलता है कैसे पेड़ तह समारोह केवल 2 के बजाय एक तर्क लेता है, जब यह नक्शा कार्य करने के लिए तर्क के रूप में पारित कर दिया है और यह अभी भी संकलित करता है तथा सही ढंग से चले।
उदाहरण के लिए, पेड़ के आकार का कार्य नीचे पेड़ के नोड्स की गणना करता है।
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
तो TreeSize पेड़ जहां tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]
ऊपर पेड़ आकार समारोह में के रूप में 4.
पेड़ के आकार देता है, पेड़ गुना समारोह भी दो के बजाय एक तर्क पारित हो जाता है चल रहा है। इसके अलावा, पेड़ गुना समारोह में पारित एक्स कहीं भी उपयोग नहीं किया जा रहा है, तो आपको इसकी आवश्यकता क्यों है। इसे हटाने से प्रोग्राम संकलित नहीं होता है और यह निम्न त्रुटि संदेश देता है।
Couldn't match type `a' with `[[Int] -> Int]'
`a' is a rigid type variable bound by
the type signature for treeSize :: Tree a -> Int
at treeFold.hs:15:1
In the first argument of `sum', namely `ys'
In the second argument of `(+)', namely `sum ys'
In the expression: 1 + sum ys
किसी भी मदद की सराहना की जाएगी।
[क्यों कार्यात्मक प्रोग्रामिंग मायने रखता है] (http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf)। –