2012-01-27 12 views
9

कोई समझाने या कैसे समारोह रचना के संबंध में काम करता है आलस्य के बारे में कुछ संसाधनों दे कृपया कर सकते हैं?आलस्य और समारोह संरचना (Haskell, erlang)

उदाहरण के लिए filter (/='W') . map toUpper $ "justaword" हास्केल में काम करता है जो एरलांग में इसके समकक्ष की तुलना में आलसी नहीं है?

उत्तर

13

हर बार एक और चरित्र की मांग की है (या अंत की अधिसूचना), अगले वर्ण - यदि कोई हो - अपरकेस में मैप किया गया है, कि 'डब्ल्यू' करने के लिए, की तुलना में अगर असमान दिया जाता है।

filter (/= 'W') . map toUpper $ "justaword" 
~> filter (/= 'W') (toUpper 'j' : map toUpper "ustaword") 
~> filter (/= 'W') ('J' : map toUpper "ustaword") 
~> 'J' : filter (/= 'W') (map toUpper "ustaword") 

अब पहले वर्ण तो या null तरह प्रश्नों take 1 जैसे कार्यों के लिए आगे कोई काम हो गया है, उपलब्ध है। यदि उपभोक्ता द्वारा अधिक पात्रों की मांग की जाती है, तो स्ट्रिंग के अंत तक पहुंचने तक उन्हें एक-एक करके उत्पादित किया जाएगा।

उदाहरण:

Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't' 
"TTTTTTTTTT" 

repeat एक अनंत सूची पैदा करता है, लेकिन जब तक केवल एक सीमित भाग सेवन किया जाता है, गणना परिमित समय में खत्म। हालांकि, take 10 . filter (/= 'W') . map toUpper $ repeat 'w' समाप्त नहीं होगा, के बाद से उत्पादन किया पात्रों में से कोई भी filter गुजरता take 10 तक पहुँचने के लिए।

+0

महान respone के लिए धन्यवाद :) यह (आलस्य का अनुकरण के बिना) सख्त भाषा में इस कोड को लिखने के लिए संभव है? या एक सख्त लैंगुएज में सूची दो बार यात्रा की जाएगी, एक बार मानचित्र के लिए और एक बार फिल्टर के लिए, beginnig से शुरू? – Adi

+1

@ एडीआई: हाँ, दो सूची ट्रैवर्सल होंगे। नक्शा एक नई इंटरमीडिएट सूची लौटाएगा, जिसे फिल्टर में पास किया जाएगा, जो कि एक और सूची – newacct

+5

से अधिक हो जाएगा और एक सख्त (उत्सुक, बल्कि) भाषा में, एक को समान व्यवहार प्राप्त करने के लिए आलस्य अनुकरण करना होगा। कुछ भाषाओं में है कि दूसरों की तुलना में आसान है, मैं बहुत बल्कि erlang या एफ # में सी (की तुलना में कर रहे है कि और बनाने है कि हालांकि मैं सी पता है, लेकिन शायद ही कोई erlang या एफ # :)। चाहे दो ट्रैवर्सल हों या एक उत्सुक भाषा में से एक कंपाइलर पर निर्भर करता है। सिद्धांत रूप में, फ़िल्टर और मानचित्र को जोड़ा जा सकता है, लेकिन आम तौर पर संकलक को मैप किए गए फ़ंक्शन की शुद्धता साबित करने की आवश्यकता होती है और फ़िल्टर ऐसा करने में सक्षम होने के लिए भविष्यवाणी करता है। इसलिए मैं ज्यादातर मामलों में दो ट्रैवर्सल की अपेक्षा करता हूं, सबूत कठिन है। –