2012-05-04 15 views
5

मैं एक फ़ंक्शन saveStuff लिखना चाहता हूं जो कुछ परीक्षणों को पास करने के बाद फ़ाइल में कुछ सहेजता है। यदि परीक्षण विफल हो जाते हैं, तो मुझे एक त्रुटि उठाने की आवश्यकता है। इस समारोह का परिणाम प्रकार क्या होना चाहिए? मैंने IO (Either String()) और IO (Maybe String) के बारे में सोचा, लेकिन उनमें से कुछ कारणों से गलत महसूस करते हैं। मैंने मानक पुस्तकालय से समान कार्यों को देखा, लेकिन वे बस IO() लौटते प्रतीत होते हैं। वे विफलताओं पर अपवाद फेंक देते हैं। मैं खुद को उस दृष्टिकोण को पसंद नहीं कर सकता।इस फ़ंक्शन का परिणाम प्रकार क्या होना चाहिए?

+7

यदि यह केवल एक ही तरीके से सफल हो सकता है, तो शायद 'शायद त्रुटि संदेश' या कुछ आइसोमोर्फिक सही प्रकार है। यदि आपको 'शायद' पसंद नहीं है क्योंकि आमतौर पर 'कुछ भी नहीं' विफलता इंगित करता है, तो 'डेटा परिणाम = सफलता | का उपयोग करें विफलता स्ट्रिंग'। –

+2

@DanielFischer: यह शायद एक उत्तर के रूप में अच्छा है (एक टिप्पणी के बजाय)। –

उत्तर

7

परिभाषित आप कुछ है कि एक ErrorT String IO() रिटर्न लिखने पर विचार कर सकता है। ErrorT मोनैड ट्रांसफॉर्मर के लिए प्रलेखन on Hackage है। एरिक किड द्वारा उत्कृष्ट Eight Ways to Report Errors और एडवर्ड यांग द्वारा कुछ वर्षों बाद follow up में और सुझाव हैं।

+0

'त्रुटि टी' मैंने जो भी सोचा था, वह भी है। आपके पास अनिवार्य रूप से एक 'आईओ() 'है, और आप किसी संदेश के साथ त्रुटि के लिए संभावित जोड़ना चाहते हैं, इसलिए बस इसके ऊपर' त्रुटि टी 'ट्रांसफॉर्मर को थप्पड़ मार दें। –

6

यदि saveStuff सफल हो सकता है तो केवल एक ही तरीका है, Maybe ErrorMessage पर एक प्रकार isomorphic सही प्रकार है। Maybe ErrorMessage में नकारात्मकता है जो NothingMaybe का उपयोग करते समय विफलता को दर्शाता है, इसलिए यह यहां अपेक्षाओं के मुकाबले चलाएगा। इसके संबंध में, Either ErrorMessage() बेहतर है, लेकिन पैरामीटर Right मामले में कोई जानकारी नहीं लेती है, इसलिए विकल्प में भी लालित्य नहीं है।

आप इन कमियों को स्वीकार नहीं करना चाहते हैं, अपने स्वयं के परिणाम प्रकार

data Result = Success | Failure ErrorMessage 
-- with type ErrorMessage = String, for example 
संबंधित मुद्दे