假设我有一个IO Int
包裹在 a 中StateT MyState
,那么我有一个State MyState Int
我想在堆叠的 monad 中使用的值。在这种内在的意义上,我如何举起它?我已经知道要使用lift
或者liftIO
如果我得到与内部兼容的东西,我只需要提升到外部 monad,但现在我遇到了相反的问题:值已经在外部 monad 但不在内部。
例如:
checkSame :: State MyState a -> IO a -> StateT MyState IO Bool
checkSame sim real = do
rres <- liftIO real
sres <- ??? sim
return $ rres == sres
我是否必须“获取”状态,手动将其推过 runState 并再次将其全部装箱,还是有一些通用的方法可以做到这一点?
顺便说一句,那个 sim 参数是一大堆与 IO 无关的有状态函数,所以StateT MyState IO a
如果可以避免的话,我有点不愿意让它们全部返回。