StateT MyState
中的 IO Int
,那么我就会得到一个值为 State MyState Int
的结果,我想在堆叠的单子中使用它。如何在这种内部情况下将它提升? 如果我得到了一些与内部兼容只需要提升到外部单子的东西,我已经知道要使用 lift
或 liftIO
,但现在我有了相反的问题: 值已经在外部单子中,但不在内部单子中。例如:
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
。
mapStateT(return. runIdentity)
或者更通用的方式hoist(return. runIdentity)
。参见https://dev59.com/fWIj5IYBdhLWcg3wnmXA。 - danidiazmmorph
现在具有generalize
函数:generalize = return . runIdentity
。 - Gabriella Gonzalez