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.

questionAnswers(1)

yourAnswerToTheQuestion