2010-09-25 16 views
5

तो जैसेहास्केल - करीना? अधिक विवरण की जरूरत है

addList :: [int] -> int 
addList = foldl1 (+) 

कुछ क्यों काम करता है? करी भाग भागो। कोई परिवर्तनीय क्यों नहीं?

+0

रिकर्सन के माध्यम से – Joren

+0

@ जोरेन: वास्तव में, उच्च-आदेश कार्यों के माध्यम से। ओपी ने आंशिक आवेदन के बारे में पूछा, अब फोल्ड के बारे में;) @ मैट: मैंने देखा है कि सबसे सभ्य हास्केल ट्यूटोरियल ने इसे समझाया, हालांकि कभी-कभी तुरंत नहीं। यदि आपका यह बिल्कुल समझा नहीं है, तो आप स्विच करना चाहेंगे। – delnan

+0

जब आप पैटर्न मिलान करते हैं तो मैं इसे समझता हूं। पसंद (((एफ 6) 7) 8) 7 के नए पैरामीटर के साथ एफ 6 लौटाता है और फिर 8 के लिए एक ही चीज़ देता है। इस मामले में ऐडलिस्ट [1,2,3,4] वापस आ गया है, लेकिन मुझे नहीं पता कि कैसे fold1 उस सूची को मिलता है। हैकेल कैसे जानता है? मुझे पता है कि इसे करी से करना है। – Matt

उत्तर

11

यदि आप f x y = bla जैसे फ़ंक्शन को परिभाषित करते हैं, तो यह f x = \y -> bla जैसा है, जो f = \x -> (\y -> bla) जैसा ही है। दूसरे शब्दों में f एक ऐसा फ़ंक्शन है जो एक तर्क लेता है, x, और एक अन्य फ़ंक्शन देता है जो एक तर्क लेता है, y, और उसके बाद वास्तविक परिणाम देता है। इसे करी के रूप में जाना जाता है।

एनालॉगस जब आप f x y करते हैं, तो यह (f x) y जैसा ही है। अर्थात। आप तर्क के साथ फ़ंक्शन f पर कॉल कर रहे हैं। यह एक और फ़ंक्शन देता है, जिसे आप तर्क y पर लागू करते हैं।

तो दूसरे शब्दों में, जब आप addList xs = foldl1 (+) xs करते हैं, आप पहली बार कॉल कर रहे हैं foldl1 (+) जो फिर एक और समारोह है, जो आप xs पर लागू होते हैं देता है। इसलिए foldl1 (+) द्वारा वापस किया गया फ़ंक्शन वास्तव में addList जैसा ही है, आप इसे addList = foldl1 (+) पर छोटा कर सकते हैं।

2

sepp2k से स्पष्टीकरण सही है, मैं बस इंगित करना चाहता हूं (पन इरादा) कि करीबी के इस एप्लिकेशन का नाम है: इसे "पॉइंट-फ्री स्टाइल" कहा जाता है। यहां पेशेवरों और विपक्ष समेत एक अच्छी व्याख्या है: http://www.haskell.org/haskellwiki/Pointfree

5

करीपी के अलावा, sepp2k ने बताया, यहां हम तथाकथित eta reduction का उपयोग करते हैं। यह लैम्ब्डा कैलकुस के कमी नियमों में से एक है जो हास्केल का आधार है। यह कहता है कि \x -> f xf के बराबर है जब xf में प्रकट नहीं होता है।

आइए इसे अपने मामले में लागू करें। मुझे लगता है कि आप addList xs = foldl1 (+) xs जैसी परिभाषा के साथ सहज हैं। हम इसे addList = \xs -> foldl1 (+) xs के रूप में फिर से लिख सकते हैं और अब ईटा कमी नियम लागू कर रहे हैं हमें addList = foldl1 (+) मिलते हैं।

यह नियम इस विचार पर आधारित है कि दो कार्य समान हैं यदि वे समान तर्कों पर लागू होने पर समान परिणाम देते हैं। यहां दो कार्य f और g = \x -> f x हैं जहां f : a -> b और हम इसे सभी c : a, f c = g c के लिए दिखाना चाहते हैं। साबित करने के लिए इसे c : a पर मनमाने ढंग से लें और इसे g पर लागू करें: g c = (\x -> f x) c = f c, अंतिम समानता बीटा कमी नामक दूसरे नियम द्वारा है जो कहती है कि फ़ंक्शन एप्लिकेशन का प्रतिस्थापन द्वारा मूल्यांकन किया जाता है।