Levante para consertar o * interior * de uma pilha de transformadores de mônada
Suponha que eu tenho umIO Int
envolto em umStateT MyState
, então eu tenho um valor deState MyState Int
que eu quero usar na mônada empilhada. Como faço para levantá-lo neste sentido interior? Eu já sei usarlift
ouliftIO
se eu conseguir algo compatível com o interior que só preciso elevar para a mônada externa, mas agora tenho o problema oposto: o valor já está na mônada externa, mas não na interna.
Por exemplo:
checkSame :: State MyState a -> IO a -> StateT MyState IO Bool
checkSame sim real = do
rres <- liftIO real
sres <- ??? sim
return $ rres == sres
Preciso 'obter' o estado, empurrá-lo através do runState à mão e encaixotar tudo novamente ou existe alguma maneira genérica de fazer isso?
BTW, esse parâmetro sim é um monte de funções com estado que não têm nada a ver com IO, por isso estou um pouco relutante em fazê-las retornarStateT MyState IO a
se eu puder evitá-lo.