let
केवल मनमाने ढंग से मूल्यों पर एक नाम या पैटर्न मैचों को असाइन करता है।
<-
के लिए, हमें पहले (वास्तव में नहीं) रहस्यमय IO
इकाई से दूर जाएं, लेकिन monads कि एक "कंटेनर" की एक धारणा है, एक सूची या Maybe
तरह विचार करते हैं। फिर <-
उस कंटेनर के तत्वों को "अनपॅकिंग" से अधिक नहीं करता है। "इसे वापस डालने" का विपरीत संचालन return
है। ,
add m1 m2 = do
v1 <- m1
v2 <- m2
return (v1 + v2)
यह "unpacks" दो कंटेनरों के तत्वों मानों को एक साथ जोड़ने के लिए, और एक ही इकाई में फिर से लपेटता: इस कोड पर विचार करें।यह सूची के साथ काम करता है, तत्वों के सभी संभव संयोजनों लेने:
main = print $ add [1, 2, 3] [40, 50]
--[41,51,42,52,43,53]
वास्तव में सूचियों के मामले में आप के रूप में अच्छी add m1 m2 = [v1 + v2 | v1 <- m1, v2 <- m2]
लिख सकते हैं। लेकिन हमारे संस्करण, भी Maybe
के साथ काम करता है:
main = print $ add (Just 3) (Just 12)
--Just 15
main = print $ add (Just 3) Nothing
--Nothing
अब IO
बिल्कुल कि अलग नहीं है। यह एक मूल्य के लिए एक कंटेनर है, लेकिन यह वायरस की तरह एक "खतरनाक" अशुद्ध मूल्य है, जिसे हमें सीधे स्पर्श नहीं करना चाहिए। do
-ब्लॉक यहां हमारे ग्लास की रोकथाम है, और <-
अंतर्निहित चीजों में हेरफेर करने के लिए अंतर्निहित "दस्ताने" हैं। return
के साथ हम तैयार होने पर, पूर्ण, बरकरार कंटेनर (और न केवल खतरनाक सामग्री) प्रदान करते हैं। वैसे, add
फ़ंक्शन IO
मानों (जो हमें फ़ाइल या कमांड लाइन या यादृच्छिक जनरेटर ... से मिला है) के साथ काम करता है।