aに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 に手で押し込み、すべてを再度ボックス化する必要がありますか、それともこれを行う一般的な方法はありますか?
StateT MyState IO a
ところで、その sim パラメータは IO とは何の関係もない一連のステートフル関数であるため、回避できる場合はそれらすべてを返すことに少し気が進まないのです。