मैं एक फ़ंक्शन saveStuff
लिखना चाहता हूं जो कुछ परीक्षणों को पास करने के बाद फ़ाइल में कुछ सहेजता है। यदि परीक्षण विफल हो जाते हैं, तो मुझे एक त्रुटि उठाने की आवश्यकता है। इस समारोह का परिणाम प्रकार क्या होना चाहिए? मैंने IO (Either String())
और IO (Maybe String)
के बारे में सोचा, लेकिन उनमें से कुछ कारणों से गलत महसूस करते हैं। मैंने मानक पुस्तकालय से समान कार्यों को देखा, लेकिन वे बस IO()
लौटते प्रतीत होते हैं। वे विफलताओं पर अपवाद फेंक देते हैं। मैं खुद को उस दृष्टिकोण को पसंद नहीं कर सकता।इस फ़ंक्शन का परिणाम प्रकार क्या होना चाहिए?
उत्तर
परिभाषित आप कुछ है कि एक ErrorT String IO()
रिटर्न लिखने पर विचार कर सकता है। ErrorT
मोनैड ट्रांसफॉर्मर के लिए प्रलेखन on Hackage है। एरिक किड द्वारा उत्कृष्ट Eight Ways to Report Errors और एडवर्ड यांग द्वारा कुछ वर्षों बाद follow up में और सुझाव हैं।
'त्रुटि टी' मैंने जो भी सोचा था, वह भी है। आपके पास अनिवार्य रूप से एक 'आईओ() 'है, और आप किसी संदेश के साथ त्रुटि के लिए संभावित जोड़ना चाहते हैं, इसलिए बस इसके ऊपर' त्रुटि टी 'ट्रांसफॉर्मर को थप्पड़ मार दें। –
यदि saveStuff
सफल हो सकता है तो केवल एक ही तरीका है, Maybe ErrorMessage
पर एक प्रकार isomorphic सही प्रकार है। Maybe ErrorMessage
में नकारात्मकता है जो Nothing
Maybe
का उपयोग करते समय विफलता को दर्शाता है, इसलिए यह यहां अपेक्षाओं के मुकाबले चलाएगा। इसके संबंध में, Either ErrorMessage()
बेहतर है, लेकिन पैरामीटर Right
मामले में कोई जानकारी नहीं लेती है, इसलिए विकल्प में भी लालित्य नहीं है।
आप इन कमियों को स्वीकार नहीं करना चाहते हैं, अपने स्वयं के परिणाम प्रकार
data Result = Success | Failure ErrorMessage
-- with type ErrorMessage = String, for example
यदि यह केवल एक ही तरीके से सफल हो सकता है, तो शायद 'शायद त्रुटि संदेश' या कुछ आइसोमोर्फिक सही प्रकार है। यदि आपको 'शायद' पसंद नहीं है क्योंकि आमतौर पर 'कुछ भी नहीं' विफलता इंगित करता है, तो 'डेटा परिणाम = सफलता | का उपयोग करें विफलता स्ट्रिंग'। –
@DanielFischer: यह शायद एक उत्तर के रूप में अच्छा है (एक टिप्पणी के बजाय)। –