2012-03-08 14 views
11

जोड़ तोड़ अगर मैं monads के एक ढेर है, कहते हैं कि IO, State और Error, और एक समारोह है कि केवल IO और Error उपयोग करता है। स्टैक से मध्य State मोनैड को "हटाने" के बारे में कैसे जाना होगा ताकि मैं अपने फ़ंक्शन का उपयोग कर सकूं? अगर ऑर्डर IO, Error, State है, तो मैं lift का उपयोग मिलान करने के लिए कर सकता हूं, लेकिन अगर मैं मोनैड स्टैक में IO और Error और संभवतः अन्य मोनैड जो भी ऑर्डर में है, तो मैं अपने फ़ंक्शन का उपयोग करने में सक्षम होना चाहता हूं। उदाहरण के लिए:इकाई ढेर

fun :: ErrorT String IO() 
fun = throwError "error" 

someCode :: ErrorT String (StateT Int IO)() 
someCode = do 
    -- I want to use fun here 

उत्तर

15

बस fun :: (MonadError String m, MonadIO m) => m() को fun के प्रकार के हस्ताक्षर बदल जाते हैं। यह तब किसी भी मोनैड स्टैक के लिए प्रयोग योग्य होगा जिसमें String त्रुटि हो, और IO (जैसे ErrorT String (StateT Int IO)) कर सकता है।

उदाहरण के लिए:

fun :: (MonadError String m, MonadIO m) => m() 
fun = do 
    liftIO $ putStrLn "in fun" 
    throwError "error" 

someCode :: ErrorT String (StateT Int IO)() 
someCode = do 
    fun 
    -- whatever you want 
+0

यह अद्भुत है, धन्यवाद! –

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