BST के लिए गुना समारोह की सामान्यीकृत संस्करण में बहुत सारे तर्क दिए

वोट
0

रनिंग गुना (+) 0 नमूना मुझे एक के बारे में (+) त्रुटि भी कई तर्क लागू किया जा रहा है देता है। क्यूं कर?

data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
Occurs check: cannot construct the infinite type: a = a -> a
Probable cause: `+' is applied to too many arguments
In the first argument of `fold'', namely `(+)'
In the expression: fold' (+) 0 sample

यह भी देखें: गुना

04/02/2011 को 01:23
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
1

आपका foldप्रकार की एक समारोह की आवश्यकता है a -> b -> b -> bअपनी पहली पैरामीटर के रूप में, कि एक समारोह है कि तीन तर्क लेता है। (+)दूसरी ओर केवल दो तर्क लेता है।

तो foldबदला जाना चाहिए या यदि आप एक अलग समारोह से कॉल करने की जरूरत है तुम क्या करने की कोशिश कर रहे वास्तव में क्या पर निर्भर करता है।

04/02/2011 को 01:28
का स्रोत उपयोगकर्ता

वोट
1

आपकी समस्या आप 3 तर्कों को समारोह आवेदन कर रहे हैं है। प्रकार हस्ताक्षर में पहले पैरामीटर यह सब कहते हैं।

fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+) केवल 2 तर्क लेता है, लेकिन जब आप इसे में पारित, यह इस का मूल्यांकन करने की कोशिश करता है:

(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

आप शायद एक द्विआधारी समारोह के साथ गुना करना चाहते हैं (एक -> एक -> एक)। आप (+) का उपयोग करना चाहते मान लीजिए। आप इस तरह बनना परिणाम हैं:

fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

बस की जगह: वहां से यह सामान्यीकरण करने के लिए आसान है +एक infixed साथf

fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)
04/02/2011 को 04:13
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more