В процессе порыва написания DC++ клиента, обнаружилось полезное свойство.
class (Monad m1, Monad m2) => MonadTwist m1 m2 where
twist :: m1 (m2 (m1 a)) -> m1 (m2 a)
newtype TwistedM m1 m2 a = Twisted { unTwist :: m1 (m2 a) }
liftTwistedM1 :: (Monad m1, Monad m2) => m1 a -> TwistedM m1 m2 a
liftTwistedM1 = Twisted . liftM return
liftTwistedM2
(
Read more... )