如果我有一个函数f :: State Int ()
,是否可以在另一个函数g :: StateT Int IO ()
中使用它?使用f = do { something; g }
嵌套它无法使用Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'
进行类型检查。
答案 0 :(得分:20)
是的,此操作通常称为“吊装”。对于州monad,它可以定义为
hoistState :: Monad m => State s a -> StateT s m a
hoistState = state . runState
不幸的是,它没有在Control.Monad.State
模块中定义。