में एक हो सकता है कि मूल्य निकाला जा रहा है निम्नलिखित को देखते हुए:आईओ
> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")
GHCi मुझे
*** Exception: user error (OOPS)
बेशक
देता है, fromMaybe सही ढंग से काम कर रहा है:
> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"
लेकिन ऐसा लगता है कि आईओ ऑपरेशन किया जा रहा है और फिर त्याग दिया गया है:
> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"
ऐसा क्यों हो रहा है? आईओ मोनड लेजर बनाने का कोई तरीका है?
विशेष रूप, value :: IO (Maybe a)
दिया एक (स्वच्छ, संक्षिप्त) जिस तरह से
result <- (liftM2 fromMaybe) err value
कहने के लिए क्या है और यह परिणाम या एक IOError तदनुसार फेंक खोल दिया है?
चिंता के लिए धन्यवाद, लेकिन यह थोड़ा निराधार है। मैं कई दूसरे-स्तरीय कार्यों में त्रुटियों को फेंक रहा हूं कि प्रत्येक कुछ कॉन्फ़िगरेशन को पकड़ने के लिए आईओओ का थोड़ा सा हिस्सा करता है। प्रथम-स्तरीय कॉन्फ़िगरेशन फ़ंक्शन उन सभी को "पकड़" के साथ प्रयास करता है और किसी भी त्रुटि को अच्छी तरह से स्वरूपित करता है। यह मुझे सभी दूसरी-स्तरीय कार्यों के माध्यम से "हैंडलरर" फ़ंक्शन को थ्रेड करने की आवश्यकता के बिना एक ही स्थान पर मेरी त्रुटि को संभालने की अनुमति देता है। ऐसे परिदृश्य में, त्रुटियां अभी भी एक बुरा विचार हैं? – So8res
So8res: व्यक्तिगत रूप से मेरे पास दूसरे-स्तरीय फ़ंक्शंस 'हो सकता है' मान उत्पन्न करते हैं, और फिर प्रथम-स्तरीय कॉन्फ़िगरेशन फ़ंक्शन या तो उन्हें 'अनुक्रम' या '<$> 'और' <*>' जैसे कुछ के साथ एक साथ जोड़ सकता है, या प्रत्येक को संभाला जा सकता है वांछित के रूप में अलग से संभावित त्रुटि। यह स्वाद का विषय है, लेकिन मेरी राय में, हास्केल में त्रुटियां लगभग हमेशा एक बुरा विचार होती हैं, क्योंकि हमारे पास शक्तिशाली अमूर्तताएं हैं जो हमें 'शायद' लिखने देती हैं। फेंक/पकड़ नियंत्रण प्रवाह तंत्र एफएस शैली से मेल नहीं खाता है जो हास्केल प्रोत्साहित करता है। –