将StateT IO与State相结合

Fra*_*ser 11 haskell

如果我有一个功能f :: State Int (),是否可以在另一个功能中使用它g :: StateT Int IO ()?嵌套它f = do { something; g }无法进行类型检查Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'.

Rom*_*aka 20

是的,此操作通常称为"吊装".对于州monad,它可以定义为

hoistState :: Monad m => State s a -> StateT s m a
hoistState = state . runState
Run Code Online (Sandbox Code Playgroud)

不幸的是,它没有在Control.Monad.State模块中定义.

  • 另请参阅[mmorph`包的教程](http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:4) (4认同)
  • @GabrielGonzalez似乎有一个monad变换器的类型类`hoistId ::(Monad m)=> t Identity a - > tma`将是对基础库的一个有用的(Haskell98)添加.对于函子`返回来说,它只是`MFunctor`的专用版本.runIdentity`. (2认同)
  • 您也可以将其写为 `hoistState = state 。runState`,这个推理起来不那么费脑子(事实上,`StateT . (return .)` 是 `state` 的定义。) (2认同)