http://lomeo.livejournal.com/ ([identity profile] lomeo.livejournal.com) wrote in [personal profile] lomeo 2006-12-05 06:16 am (UTC)

Конечно можно. Методы сталкиваться не будут, потому что для высасывания второй монады состояния предётся делать lift $ lift $. Например,


type MyCoolT = StateT MyData1 (ErrorT String (StateT MyData2 IO)) ()

updateBoth :: (MyData1 -> MyData1) -> (MyData2 -> MyData2) -> MyCoolT
updateBoth funOnType1 funOnType2 = do
    modify funOnType1
    lift $ catchError
                (lift $ modify funOnType2 >> (lift $ print "xe-xe"))
                (\e -> liftIO $ print "Error! :-)")


В данном случае, скорее всего обработка не нужна и у тебя уже будет готовая функция liftState2 = lift . lift, тогда


updateBoth :: (MyData1 -> MyData1) -> (MyData2 -> MyData2) -> MyCoolT
updateBoth funOnType1 funOnType2 = do
    modify funOnType1
    liftState2 $ modify funOnType2


Примерно так.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting