Поднимите, чтобы зафиксировать * внутреннюю часть * монадного стека трансформаторов.
Предположим, у меня естьIO Int
завернутый вStateT MyState
тогда у меня есть значение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
если я могу избежать этого.