त्वरित रेफरी:
evaluate
के प्रकार है:
evaluate :: a -> IO a
seq
प्रकार a -> b -> b
है। यह पहली बार पहले तर्क का मूल्यांकन करता है, फिर दूसरा तर्क देता है।
evaluate x `seq` y ==> y
evaluate x `catch` f ==> (return $! x) `catch` f
evaluate x >>= f ==> (return $! x) >>= f
return $! x
और (return $! x) >>= return
के बीच का अंतर इस अभिव्यक्ति के साथ स्पष्ट हो जाता है:
evaluate undefined `seq` 42
पहला नियम के अनुसार, कि 42 का मूल्यांकन करना चाहिए
मूल्यांकन इन तीन नियमों का पालन करती
के साथपरिभाषा, उपर्युक्त अभिव्यक्ति एक अपरिभाषित अपवाद का कारण बन जाएगी। यह मान ⊥ है, जो बराबर 42.
(return $! x) >>= return
परिभाषा के साथ नहीं है यह बराबर करता है 42
असल में, return $! x
प्रपत्र सख्त है आईओ मूल्य गणना की जाती है जब है। दूसरा रूप केवल तभी सख्त होता है जब आईओ मान चलाया जाता है और मूल्य का उपयोग किया जाता है (>>=
का उपयोग करके)। अधिक जानकारी के लिए
this mailing list thread देखें।
स्रोत
2012-03-04 12:49:21
क्या यह वास्तव में मोनैड कानूनों का उल्लंघन नहीं करता है? – leftaroundabout
@ बाएंराउंडबाउट नहीं, यह नहीं है। यदि दौड़ते हैं तो दोनों बिल्कुल वही व्यवहार करते हैं, लेकिन यदि आप अभिव्यक्तियों को 'seq' करते हैं, तो $ वापसी करें! एक्स' में 'seq' बाहरी है, जबकि' ($ $ x वापस) >> = वापसी' में '(>> =)' बाहरीतम है। –
@ बाएंराउंडबाउट: नहीं, क्योंकि ⊥ कानूनों के प्रयोजनों के लिए अनदेखा किया जाता है। 'रीडर' जैसे मानक मोनैड वैसे ही व्यवहार करते हैं। (मैं डैनियल फिशर के तर्क (जिसे मैंने दूसरों से पहले सुना है) नहीं खरीदते हैं, क्योंकि "वास्तव में एक ही तरह से व्यवहार किया जाता है" वास्तव में एक अच्छी तरह से परिभाषित अवधारणा नहीं है।) – ehird