lomeo: (лямбда)
[personal profile] lomeo
Хорошая статья про монад-трансформеры для тех, кто ещё не понимает как с ними работать:
Monad transformers step-by-step

Date: 2006-12-05 06:16 am (UTC)
From: [identity profile] lomeo.livejournal.com
Конечно можно. Методы сталкиваться не будут, потому что для высасывания второй монады состояния предётся делать 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


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

Date: 2006-12-05 06:48 am (UTC)
From: [identity profile] rvp74.livejournal.com
Если ErrorT e (StringT ...

уже содержит слифтенный get, то у тебя получился лишний lift


PS: и вообще, я уже наелся этими трансформерами

Date: 2006-12-05 06:55 am (UTC)
From: (Anonymous)
s/StringT/StateT

Промазал немного

Date: 2006-12-05 08:33 am (UTC)
From: [identity profile] lomeo.livejournal.com
А чёрт, про пересечения трансформеров вечно забываю...
А что наелся? Что взамен то?

Date: 2006-12-05 11:41 am (UTC)
From: [identity profile] rvp74.livejournal.com
в моем случае взамен IORef ;)

Date: 2006-12-05 11:49 am (UTC)
From: [identity profile] lomeo.livejournal.com
ну, можно и так :-)

Profile

lomeo: (Default)
Dmitry Antonyuk

April 2024

S M T W T F S
 123456
7891011 1213
14151617181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 13th, 2025 09:21 am
Powered by Dreamwidth Studios