2012-03-04 18 views
21

यहाँ का मूल्यांकन प्रलेखन के एक उद्धरण: (सीएफ http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Control-Exception-Base.html#v:evaluate)"का मूल्यांकन" समारोह

evaluate x 

रूप

return $! x 

समान नहीं है एक सही परिभाषा

evaluate x = (return $! x) >>= return 
है

मैं इन दो परिभाषाओं के बीच अर्थपूर्ण अंतर को समझ नहीं पा रहा हूं ... क्या कोई ऐसा व्यक्ति है जो मेरी मदद कर सकता है? अग्रिम धन्यवाद!

+4

क्या यह वास्तव में मोनैड कानूनों का उल्लंघन नहीं करता है? – leftaroundabout

+2

@ बाएंराउंडबाउट नहीं, यह नहीं है। यदि दौड़ते हैं तो दोनों बिल्कुल वही व्यवहार करते हैं, लेकिन यदि आप अभिव्यक्तियों को 'seq' करते हैं, तो $ वापसी करें! एक्स' में 'seq' बाहरी है, जबकि' ($ $ x वापस) >> = वापसी' में '(>> =)' बाहरीतम है। –

+4

@ बाएंराउंडबाउट: नहीं, क्योंकि ⊥ कानूनों के प्रयोजनों के लिए अनदेखा किया जाता है। 'रीडर' जैसे मानक मोनैड वैसे ही व्यवहार करते हैं। (मैं डैनियल फिशर के तर्क (जिसे मैंने दूसरों से पहले सुना है) नहीं खरीदते हैं, क्योंकि "वास्तव में एक ही तरह से व्यवहार किया जाता है" वास्तव में एक अच्छी तरह से परिभाषित अवधारणा नहीं है।) – ehird

उत्तर

19

त्वरित रेफरी:

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 देखें।

+0

'क्यों (वापसी $! अपरिभाषित) >> = वापसी '' वापसी $ से अलग है! undefined'?मेरा अनुमान है कि पूर्व में संकेत की एक अतिरिक्त परत शामिल होती है जो 'अपरिभाषित' को '((वापसी $! अपरिभाषित) >> = वापसी) \ 'seq \' 42' में मूल्यांकन करने से रोकती है। – mucaho

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