Levante para fijar el * interior * de una pila de transformador de mónada

Supongamos que tengo unIO Int envuelto en unStateT MyState, entonces tengo un valor deState MyState Int que quiero usar en la mónada apilada. ¿Cómo lo levanto en este sentido interno? Ya se usarlift oliftIO si obtengo algo compatible con el interior que solo necesito levantar a la mónada externa, pero ahora tengo el problema opuesto: el valor ya está en la mónada externa pero no en la interna.

Por ejemplo:

checkSame :: State MyState a -> IO a -> StateT MyState IO Bool
checkSame sim real = do
  rres <- liftIO real
  sres <- ??? sim 
  return $ rres == sres

¿Tengo que 'obtener' el estado, empujarlo a través de runState a mano y encajonarlo todo nuevamente, o hay alguna forma genérica de hacer esto?

Por cierto, ese parámetro sim es un montón de funciones con estado que no tienen nada que ver con IO, por lo que soy un poco reacio a hacer que todas vuelvanStateT MyState IO a si puedo evitarlo

Respuestas a la pregunta(1)

Su respuesta a la pregunta