2013-06-26 36 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'。 –