Предположим, у меня есть 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 - это целая куча функций с отслеживанием состояния, которые не имеют ничего общего с вводом-выводом, поэтому я немного не хочу, чтобы они все возвращали StateT MyState IO a
, если я могу этого избежать.
mapStateT (return . runIdentity)
или, в более общем смысле,hoist (return . runIdentity)
. См. stackoverflow.com/questions/20066858/ - person danidiaz   schedule 29.11.2014mmorph
теперь имеет функциюgeneralize
:generalize = return . runIdentity
. - person Gabriel Gonzalez   schedule 03.12.2014