2012-11-20 12 views
8

आम तौर पर, foldlfoldl' या foldr के पक्ष में से बचा जाता है। Real World Haskell का हवाला देते हुए: भले ही वह एकमुश्त असफल नहीं है, यह अनावश्यक रूप से अक्षम हो जाएगा:फ़ोल्डल के संदर्भ में कुछ प्रीलूड फ़ंक्शंस क्यों परिभाषित किए गए हैं?

कारण foldl की thunking व्यवहार करने के लिए, यह असली कार्यक्रमों में इस समारोह से बचने के लिए बुद्धिमान है। इसके बजाय, डेटा आयात करें। सूची और फ़ोल्डल का उपयोग करें।

फिर भी कुछ प्रस्तावना कार्यों यह (जैसे (\\) और unionBy) के रूप में परिभाषित कर रहे हैं। ऐसा क्यों है? क्या यह इन कार्यों के लिए बहुत सख्तता पेश नहीं कर रहा है?

+0

नोट: जीएचसी में सख्तता विश्लेषण का अर्थ है कि 'फोल्ड' बेहतर तरीके से सोचने से बेहतर काम करता है। – singpolyma

+0

कड़ाई से बोलते हुए, '(\\) 'और' UnionBy' प्रस्ताव में नहीं हैं। – sdcvvc

उत्तर

13

प्रीलूड foldl' से पहले डिज़ाइन किया गया था, और उसके बाद से पिछड़ा संगतता (सख्तता के संबंध में, जैसा कि आपने बताया है) को बनाए रखने के दबाव रहे हैं।

+0

यह दिलचस्प है। तो 'फ़ोल्ड' प्रचार का उपयोग न करने की सलाह क्या है? मेरा मतलब है, क्या हमें '(\\) 'और' UnionBy' से भी बचाना चाहिए? – Tarrasch

+0

@ टारसच अक्सर, हाँ, विशेष रूप से संख्यात्मक गुना के साथ। 'Sum '= foldl' (+) 0' को लागू करने के लिए यह बहुत आम है और प्रत्येक परियोजना में ऐसी चीजें जिन्हें उनकी आवश्यकता होती है। –

+0

@DanielWagner: वास्तव में, 'US'REPORT_PRELUDE' को छोड़कर 'sum'' foldl' के संदर्भ में परिभाषित नहीं किया गया है: http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/src /डेटा- लिस्ट.html#sum – amindfv

4

दोनों मामलों में संचयक [a] प्रकार का है। मैं नहीं देख सकता कि सूची को कमजोर करने के लिए मजबूर करना-सामान्य सामान्य रूप से बड़ा अंतर आएगा, और इस तरह की आंशिक कठोरता शुरू करने से कुछ मनमाना लगता है।

10

(\\) और unionBy के मामले में, मुड़ा हुआ समारोह टाइप

foo :: [a] -> b -> [a] 

और foo xs y, xs से सबसे ज्यादा एक तत्व पर निकालता है तो foldl' का उपयोग कर सामान्य रूप में वहाँ कुछ भी नहीं खरीदा जाएगा है, Thunks का निर्माण किया जाएगा इसके बाद इसके ऊपर के शीर्ष (:) के दाईं ओर।

यह कठोरता के मामले में एक फर्क नहीं होता है, जहाँ तक मैं देख सकते हैं, दोनों परतों केवल मूल्यांकन किया जाना है जब परिणाम कमजोर सिर सामान्य रूप के लिए मूल्यांकन किया जाना चाहिए, और जब भी foldl' एक _|_ उत्पादन, इसलिए होगा foldl होगा।

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