आलसी मूल्यांकन के लिए धन्यवाद, एक हास्केल कार्यक्रम (लगभग नहीं कर सकता है) ) जैसा वह दिखता है।
इस कार्यक्रम पर विचार करें:
main = putStrLn (show (quicksort [8, 6, 7, 5, 3, 0, 9]))
एक उत्सुक भाषा में, सबसे पहले quicksort
, फिर show
, तब चलेगाputStrLn
। फ़ंक्शन के तर्क की गणना की जाती है, इससे पहले कि फ़ंक्शन चलना शुरू हो जाए।
हास्केल में, यह विपरीत है। फ़ंक्शन पहले चलना शुरू होता है। तर्कों की गणना केवल तब की जाती है जब फ़ंक्शन वास्तव में उनका उपयोग करता है। और एक यौगिक तर्क, एक सूची की तरह, एक समय में एक टुकड़े की गणना की जाती है, क्योंकि इसके प्रत्येक टुकड़े का उपयोग किया जाता है।
तो इस कार्यक्रम में पहली बात यह है किputStrLn
चलना शुरू होता है।
जीएचसी केputStrLn
कार्यों के कार्यान्वयन को तर्क के पात्रों को कॉपी करके आउटपुट बफर में भेज दिया गया है। लेकिन जब यह इस लूप में प्रवेश करता है, तो show
अभी तक नहीं चला है। इसलिए, जब यह स्ट्रिंग से पहले चरित्र को कॉपी करने के लिए जाता है, तो हास्केल उस चरित्र की गणना करने के लिए आवश्यक कॉल show
और quicksort
कॉल के अंश का मूल्यांकन करता है । फिर अगले चरित्र की ओर बढ़ता है। तो सभी तीन कार्यों के निष्पादन ,putStrLn
putStrLn
show
है, और quicksort
- interleaved है। आकस्मिक रूप से quicksort
क्रियान्वित होता है, बिना काटे हुए थैलों का एक ग्राफ छोड़ता है क्योंकि यह याद रखता है कि यह कहाँ छूट गया।
अब यह बेतहाशा अलग है कि आप क्या उम्मीद कर सकते हैं यदि आप परिचित हैं, तो आप जानते हैं, किसी भी अन्य प्रोग्रामिंग भाषा। यह quicksort
याद रखना आसान नहीं है कि वास्तव में मेमोरी एक्सेस या तुलना के क्रम के मामले में हास्केल के साथ कैसा व्यवहार होता है। यदि आप केवल व्यवहार का निरीक्षण कर सकते हैं, और स्रोत कोड नहीं, तो आप पहचान नहीं पाएंगे कि यह एक क्विकॉर्ट के रूप में क्या कर रहा है ।
उदाहरण के लिए, पहले पुनरावर्ती कॉल से पहले सभी डेटा को एस्कॉर्ट विभाजन का सी संस्करण। हास्केल संस्करण में, परिणाम का पहला तत्व गणना किया जाएगा (और यहां तक कि आपकी स्क्रीन पर भी दिखाई दे सकता है) पहले विभाजन के समाप्त होने से पहले - वास्तव में किसी भी काम के पूरा होने से पहले greater
।
पीएस हास्केल कोड अधिक क्विकर-जैसा होगा अगर यह क्विकर्स के समान तुलना करता है; जैसा कि लिखा गया कोड दो बार कई तुलना करता है क्योंकि lesser
और greater
स्वतंत्र रूप से गणना करने के लिए निर्दिष्ट किया जाता है, सूची के माध्यम से दो रैखिक स्कैन करता है। बेशक यह संकलक के लिए सिद्धांत में संभव है कि अतिरिक्त तुलना को खत्म करने के लिए पर्याप्त स्मार्ट हो; या कोड का उपयोग करने के लिए बदला जा सकता हैData.List.partition
।
पीपीएस हास्केल एल्गोरिदम का उत्कृष्ट उदाहरण है कि आप जो व्यवहार की उम्मीद करते हैं, वह यह नहीं है कि आप किस तरह से अनुमान लगा रहे हैं कि आप कंप्यूटिंग प्राइम के लिए एराटोस्थनीज की छलनी हैं ।