Сразу ламерский вопрос: можно ли написать что-то навроде StateT чё-то (ErrorT String (StateT ещё-чё-то какая-нибудь монада)) ? Или методы из первого и второго StateT будут сталкиваться именами?
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a } зачем здесь newtype? Чтобы нельзя было руками конструктор ReaderT вызвать? Чё-то у меня как-то плохо с пониманием newtype. :(
А об instance Monad ((->) r) я чуть моск не сломал
newtype оборачивает один тип так, что bottom обёрнутого типа становится bottom для newtype, при оборачивании с помощью data мы будем различать bottom обёрнутого типа и самого. т.е. по идее самого типа нет, это только фича type checker. больше отличий вроде нет.
Поэтому, возможно, это делается для требуемого поведения при исключениях. Возможно, для эффективности (лишнего типа нет). хз.
Здесь на самом деле будет тип r -> m a, т.е. после компиляции runReaderT вызываться не будет - такой функции просто нет.
Про инстанс я понимаю. А в жизни это зачем нужно? Вот тут у них, типа, конструктор свой, поэтому стандартных инстансов нет, так что, newtype используется не за этим.
Имхо, потому что синоним не позволяет полморфные типа, в данном случае не опишешь синоним для r -> m a. А newtype позволяет определить тип со своим порядком следования полиморфных типов. И тогда мы можем сказать типа Monad (ReaderT r m) или MonadTrans (ReaderT r). Может быть за этим?
В смысле, описать то type MyReaderT r m a = r -> m a сможешь, а вот instance MonadTrans (MyReaderT r) хрен сделаешь, если я не ошибаюсь.
Спасибо!
Date: 2006-12-04 08:08 pm (UTC)no subject
Date: 2006-12-04 10:44 pm (UTC)no subject
Date: 2006-12-05 06:18 am (UTC)no subject
Date: 2006-12-05 12:23 am (UTC)no subject
Date: 2006-12-05 01:35 am (UTC)StateT чё-то (ErrorT String (StateT ещё-чё-то какая-нибудь монада)) ?
Или методы из первого и второго StateT будут сталкиваться именами?
no subject
Date: 2006-12-05 06:16 am (UTC)В данном случае, скорее всего обработка не нужна и у тебя уже будет готовая функция liftState2 = lift . lift, тогда
Примерно так.
no subject
Date: 2006-12-05 06:48 am (UTC)уже содержит слифтенный get, то у тебя получился лишний lift
PS: и вообще, я уже наелся этими трансформерами
no subject
Date: 2006-12-05 06:55 am (UTC)Промазал немного
no subject
Date: 2006-12-05 08:33 am (UTC)А что наелся? Что взамен то?
no subject
Date: 2006-12-05 11:41 am (UTC)no subject
Date: 2006-12-05 11:49 am (UTC)Monad Transformers and Modular Interpretator
Date: 2006-12-05 08:31 am (UTC)http://web.cecs.pdx.edu/~mpj/pubs/modinterp.html
Re: Monad Transformers and Modular Interpretator
Date: 2006-12-05 09:03 am (UTC)читаю
Date: 2006-12-05 10:46 am (UTC)зачем здесь newtype? Чтобы нельзя было руками конструктор ReaderT вызвать?
Чё-то у меня как-то плохо с пониманием newtype. :(
А об instance Monad ((->) r) я чуть моск не сломал
Re: читаю
Date: 2006-12-05 11:27 am (UTC)newtype оборачивает один тип так, что bottom обёрнутого типа становится bottom для newtype, при оборачивании с помощью data мы будем различать bottom обёрнутого типа и самого. т.е. по идее самого типа нет, это только фича type checker. больше отличий вроде нет.
Поэтому, возможно, это делается для требуемого поведения при исключениях. Возможно, для эффективности (лишнего типа нет). хз.
Здесь на самом деле будет тип r -> m a, т.е. после компиляции runReaderT вызываться не будет - такой функции просто нет.
Это я так думаю, честно говоря. Надо почитать.
Re: читаю
Date: 2006-12-05 11:54 am (UTC)Re: читаю
Date: 2006-12-05 11:55 am (UTC)Re: читаю
Date: 2006-12-05 12:28 pm (UTC)newtype
Date: 2006-12-05 01:02 pm (UTC)Re: newtype
Date: 2006-12-05 01:09 pm (UTC)Re: читаю
Date: 2006-12-05 01:07 pm (UTC)А 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)Re: читаю
Date: 2006-12-05 02:19 pm (UTC)Я правильно понял, что
Date: 2006-12-05 12:57 pm (UTC)Re: Я правильно понял, что
Date: 2006-12-05 01:08 pm (UTC)Re: Я правильно понял, что
Date: 2007-02-13 09:41 am (UTC)