2013-06-26 7 views
10

के साथ राज्य स्टेट IO का संयोजन यदि मेरे पास f :: State Int() कोई फ़ंक्शन है, तो क्या इसे किसी अन्य फ़ंक्शन g :: StateT Int IO() के भीतर उपयोग करना संभव है? f = do { something; g } के साथ इसे Nesting Couldn't match type 'Data.Functor.Identity.Identity' with 'IO' के साथ टाइप चेक करने में विफल रहता है।राज्य

+0

'जी = डू {कुछ नहीं होना चाहिए; एफ} '? आप जी के भीतर एफ का उपयोग करना चाहते हैं, है ना? – gumik

उत्तर

18

हां, इस ऑपरेशन को आमतौर पर "hoisting" कहा जाता है। बस को परिभाषित करने और निम्नलिखित समारोह का उपयोग करें:

hoistState :: Monad m => State s a -> StateT s m a 
hoistState = StateT . (return .) . runState 

दुर्भाग्य से, यह Control.Monad.State मॉड्यूल में परिभाषित नहीं है।

+0

बहुत बढ़िया, धन्यवाद! – Fraser

+3

[mmorph' पैकेज] के लिए ट्यूटोरियल भी देखें (http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#gOMAIN) –

+2

@ गैब्रियल गोंज़ालेज़ 'hoistId :: (मोनाड एम) => टी पहचान ए -> टीएमए के साथ मोनैड ट्रांसफार्मर के लिए एक प्रकार-वर्ग होने जैसा लगता है बेस बेसरी के लिए एक उपयोगी (हास्केल 9 8) होगा। यह मजेदार 'रिटर्न के लिए' एमफंक्टर 'का सिर्फ एक विशेष संस्करण होगा। runIdentity'। –

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