2013-06-26 62 views
10

如果我有一個功能f :: State Int(),是否可以在另一個功能g :: StateT Int IO()內使用它?將其與f = do { something; g }嵌套不能與Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'覈對。組合StateT IO與狀態

+0

不應該有'g = do {something; f}'?你想在g中使用f,對嗎? – gumik

回答

18

是的,這個操作通常被稱爲「提升」。只需定義並使用以下功能:

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#g:4) –

+2

@GabrielGonzalez似乎有一個具有'hoistId ::(Monad m)=> t的monad變換器的類型類,對於基本庫來說,標識符a - > tma'是一個有用的(Haskell98)。它只是函子'return的'MFunctor'的專用版本。 runIdentity'。 –