lomeo: (лямбда)
Dmitry Antonyuk ([personal profile] lomeo) wrote2006-12-04 07:13 pm

Про трансформеры

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

читаю

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

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

Re: читаю

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

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

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

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

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

Re: читаю

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

Re: читаю

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

Re: читаю

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

newtype

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

Re: newtype

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

Re: читаю

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

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

Re: читаю

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

Re: читаю

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