2012-12-07 16 views
10

shown in this answer, sequndefined के साथ संयुक्त समीकरण तर्क की बात करते समय बहुत अजीब चीजें करता है, उदाहरण के लिए यह कोई भी monad विफल हो सकता है। एक और उदाहरण this question में है।`seq` की तुलना में 'मूल्यांकन' सुरक्षित है?

हाल ही में मैंने evaluate :: a -> IO a पर ठोकर खाई है जो एक समान बात करता है - यह डब्ल्यूएचएनएफ को इसके तर्क का मूल्यांकन करता है, लेकिन केवल IO कार्रवाई का मूल्यांकन किया जाता है। यह अधिक सुरक्षित लगता है, क्योंकि एक उम्मीद करता है कि "IO में हम सबकुछ कर सकते हैं"। बेशक इसे हर जगह इस्तेमाल नहीं किया जा सकता है, लेकिन अक्सर किसी अभिव्यक्ति का मूल्यांकन करने की आवश्यकता IO ऑपरेशन के साथ किसी भी तरह से जुड़ी होती है (जैसे MVar एस के साथ काम करते समय उपभोग करने वाले थ्रेड के बजाय गणना करने के लिए एक उत्पादन धागे को मजबूर करना)।

तो मैं पूछना चाहता हूं, evaluate कितना सुरक्षित है? क्या उदाहरण बनाना संभव है (IO बेशक) जहां यह seq जैसे कोड के बारे में तर्क तोड़ता है? या क्या मैं इसे seq (यदि यह किसी विशेष कार्यक्रम के लिए संभव है) के सुरक्षित प्रतिस्थापन के रूप में विचार कर सकता हूं?

उत्तर

5

नहीं, आपको अभी भी seq कमांड के कारण एक ही समस्याएं मिलती हैं, जिसमें evaluate के पहले तर्क में उपयोग किए गए किसी भी मोनड के मोनड नियम टूटे होंगे। यह ertes के जवाब में शासन बंद आधारित:

Kleisli श्रेणी इकाई return को जन्म देता है में पहचान आकारिता है और (<=<) रचना है। तो return(<=<) के लिए एक पहचान होनी चाहिए:

return <=< x = x 

इसका मतलब है आप कार्यक्रम के संचालन को बदले बिना किसी वैध इकाई के साथ x साथ return <=< x को बदलने के लिए सक्षम होना चाहिए।

evaluate समारोह के साथ कि का उपयोग करना ...

evaluate (return <=< undefined :: a -> Identity b) >> putStrLn "hello" 

आउटपुट नमस्ते। क्या उपयोग करना undefined साथ return <=< undefined की जगह एक बराबर बयान होना चाहिए:

evaluate (undefined :: a -> Identity b) >> putStrLn "hello" 

बजाय एक Prelude.undefined अपवाद का कारण बनता है।

यह केवल मूल्यांकन समारोह के साथ होता है। ध्यान दें कि return में evaluate के समान ही प्रकार का हस्ताक्षर है। यदि आप उपरोक्त आदेशों में return के साथ evaluate को प्रतिस्थापित करते हैं, तो दोनों आदेशों के लिए परिणामी कार्रवाई समान है (वे आउटपुट hello)।

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