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

Спасибо!

Date: 2006-12-04 08:08 pm (UTC)
From: [identity profile] nealar.livejournal.com
Ещё ничего интересного не прочитал, но уже очень нравится.

Date: 2006-12-04 10:44 pm (UTC)
From: [identity profile] thesz.livejournal.com
Здорово. Весёлая статья, спасибо. ;)

Date: 2006-12-05 06:18 am (UTC)
From: [identity profile] lomeo.livejournal.com
как бы она пригодилась мне чуть меньше года назад! Эх!

Date: 2006-12-05 12:23 am (UTC)
From: [identity profile] nealar.livejournal.com
Замечательно! Теперь для полного прояснения сознания исходники трансформеров разобрать осталось.

Date: 2006-12-05 01:35 am (UTC)
From: [identity profile] nealar.livejournal.com
Сразу ламерский вопрос: можно ли написать что-то навроде
StateT чё-то (ErrorT String (StateT ещё-чё-то какая-нибудь монада)) ?
Или методы из первого и второго StateT будут сталкиваться именами?

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
ну, можно и так :-)

Monad Transformers and Modular Interpretator

Date: 2006-12-05 08:31 am (UTC)
From: (Anonymous)
Статья на эту же тему:

http://web.cecs.pdx.edu/~mpj/pubs/modinterp.html

Re: Monad Transformers and Modular Interpretator

Date: 2006-12-05 09:03 am (UTC)
From: [identity profile] lomeo.livejournal.com
Спасибо! Хорошая статья.

читаю

Date: 2006-12-05 10:46 am (UTC)
From: [identity profile] nealar.livejournal.com
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
зачем здесь newtype? Чтобы нельзя было руками конструктор ReaderT вызвать?
Чё-то у меня как-то плохо с пониманием newtype. :(

А об instance Monad ((->) r) я чуть моск не сломал

Re: читаю

Date: 2006-12-05 11:27 am (UTC)
From: [identity profile] lomeo.livejournal.com
В смысле, что значит руками вызвать?

newtype оборачивает один тип так, что bottom обёрнутого типа становится bottom для newtype, при оборачивании с помощью data мы будем различать bottom обёрнутого типа и самого. т.е. по идее самого типа нет, это только фича type checker. больше отличий вроде нет.

Поэтому, возможно, это делается для требуемого поведения при исключениях. Возможно, для эффективности (лишнего типа нет). хз.

Здесь на самом деле будет тип r -> m a, т.е. после компиляции runReaderT вызываться не будет - такой функции просто нет.

Это я так думаю, честно говоря. Надо почитать.

Re: читаю

Date: 2006-12-05 11:54 am (UTC)
From: [identity profile] nealar.livejournal.com
Чем от type отличается? С помощью type делается вообще точная копия, а не только bottom.

Re: читаю

Date: 2006-12-05 11:55 am (UTC)
From: [identity profile] lomeo.livejournal.com
тем, что при type - тип тот же, но синоним, а здесь другой (например можешь для этого типа сделать другой инстанс какого нибудь класса).

Re: читаю

Date: 2006-12-05 12:28 pm (UTC)
From: [identity profile] nealar.livejournal.com
Про инстанс я понимаю. А в жизни это зачем нужно? Вот тут у них, типа, конструктор свой, поэтому стандартных инстансов нет, так что, newtype используется не за этим.

newtype

Date: 2006-12-05 01:02 pm (UTC)
From: [identity profile] nealar.livejournal.com
Похоже, для экономии. Памяти под конструкторы или ещё чего-нибудь этакого. Я StateMonad писал через data - и ничего, работала. А у них через newtype.

Re: newtype

Date: 2006-12-05 01:09 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Мы вроде type уже обсуждаем, а не data? Для data всё понятно - эффективность, тип то тот же самый остаётся.

Re: читаю

Date: 2006-12-05 01:07 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Имхо, потому что синоним не позволяет полморфные типа, в данном случае не опишешь синоним для r -> m a.
А newtype позволяет определить тип со своим порядком следования полиморфных типов. И тогда мы можем сказать типа Monad (ReaderT r m) или MonadTrans (ReaderT r). Может быть за этим?

В смысле, описать то type MyReaderT r m a = r -> m a сможешь, а вот instance MonadTrans (MyReaderT r) хрен сделаешь, если я не ошибаюсь.

Re: читаю

Date: 2006-12-05 01:16 pm (UTC)
From: [identity profile] nealar.livejournal.com
Да, GHC не даёт. Я, правда, не понимаю, как он это обосновывает.

Re: читаю

Date: 2006-12-05 02:19 pm (UTC)
From: [identity profile] lomeo.livejournal.com
ХЗ, сейчас на ru_lambda спрошу.

Я правильно понял, что

Date: 2006-12-05 12:57 pm (UTC)
From: [identity profile] nealar.livejournal.com
можно сделать трансформатор своими руками, написав instance MonadTrans?

Re: Я правильно понял, что

Date: 2007-02-13 09:41 am (UTC)
From: [identity profile] rvp74.livejournal.com
c помощью MonadTrans можно сделать только лифтера. Для этого он, собственно, и служит

Profile

lomeo: (Default)
Dmitry Antonyuk

April 2024

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

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 12th, 2025 11:16 am
Powered by Dreamwidth Studios