2012-04-04 19 views
5

मुझे लगता है कि मैं इकाई ट्रांसफार्मर के कुछ बुनियादी समझ याद कर रहा हूँ, क्योंकि मुझे लगने इस कोड लिखने:लिफ्ट त्रुटि मान

import Control.Monad.Identity 
import Control.Monad.Error 

liftError :: Either String Int -> ErrorT String Identity Int 
liftError x = do case x of 
        Right val -> return val 
        Left err -> throwError err 

gateway :: Bool -> ErrorT String Identity Int 
gateway = liftError . inner 

inner :: Bool -> Either String Int 
inner True = return 5 
inner False = throwError "test" 

हालांकि यह काम करता है, मुझे लगता है कि यह अधिक किया जा सकता है सुंदर ढंग से। विशेष रूप से, मैं liftError के प्रतिस्थापन की तलाश में हूं, जो मुझे लगता है कि मुझे अपने लिए परिभाषित नहीं करना चाहिए।

gateway और inner बनाने के लिए सबसे आसान तरीका क्या होगा?

उत्तर

6

यदि आप बस थोड़ा प्रकार बदलते हैं, तो आपको कोई उठाना नहीं है।

{-# LANGUAGE FlexibleContexts #-} 

gateway :: Bool -> ErrorT String Identity Int 
gateway = inner 

inner :: MonadError String m => Bool -> m Int 
inner True = return 5 
inner False = throwError "test" 

MonadErrorErrorT और Either दोनों के लिए उदाहरण हैं, तो इस तरह से आप inner दोनों के रूप में उपयोग कर सकते हैं।

+0

ठीक है, इसलिए अधिक विशिष्ट होने के लिए, यदि मैं प्रकारों को छोड़ना चाहता हूं तो मुझे मैन्युअल उठाने का कार्य लिखना होगा? यह सिर्फ मेरी समझ के लिए है। बीटीडब्ल्यू दुर्भाग्य से मैं आज वोट नहीं दे सकता:/आपको कल वोट मिलेगा :) –

+1

प्रकारों को बदलने के बिना, आप 'त्रुटि टी का उपयोग कर सकते हैं। अपने 'liftError' फ़ंक्शन के स्थान पर वापस लौटें। आप आंतरिक रूप से अधिक सामान्य संस्करण का भी उपयोग कर सकते हैं और केवल प्रतिबंधित प्रकार के साथ 'आंतरिक' की एक प्रति का पर्दाफाश कर सकते हैं। – hammar

+0

वह 'त्रुटि टी। वापसी 'वही था जो मैं खोज रहा था। जैसा कि मैंने उल्लेख किया है, इसका कोई वास्तविक कोड नहीं है, मैं सिर्फ मोनड ट्रांसफार्मर की अवधारणा को समझना चाहता हूं :) –

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