
There have been some discussions of augmentations of the monad transformer library. I at least know there was a discussion regarding strictness of state/value components in the state monad transformer (I must admit I didn't track the conclusion of that one). I have another small mtl complaint: ReaderT, for example, requires the base type to be a Monad in order to make it a Functor. So it's Monad m => Functor (ReaderT r m) instead of Functor f => Functor (ReaderT r f), which is what's actually necessary for the instance. Remember, I did say _small_ complaint. I realize this has a bit to do with the class heirarchy and that's a sensitive issue. Regarding backwards compatibility and interface changes, note that the Monad m => Monad (ReaderT r m) instance would be unaffected by this... it's only the Functor => Functor instance. If someone wants to treat a transformed monad as a functor, then they're probably savvy enough to specify the base monad as a functor (especially with the @fmap f = (>>= return . f)@ recipe). They won't even see a difference unless they are rolling their own monad, since all mtl monads are also functors. 1) Is there a collection of these suggestions specifically for mtl? On the wiki? On the bug tracker? 2) Any chance we could make this change to the library? Thanks, Nick

On Sun, Jan 21, 2007 at 12:37:02PM -0600, Nicolas Frisby wrote:
I have another small mtl complaint: ReaderT, for example, requires the base type to be a Monad in order to make it a Functor. So it's Monad m => Functor (ReaderT r m) instead of Functor f => Functor (ReaderT r f), which is what's actually necessary for the instance. Remember, I did say _small_ complaint.
I realize this has a bit to do with the class heirarchy and that's a sensitive issue. Regarding backwards compatibility and interface changes, note that the Monad m => Monad (ReaderT r m) instance would be unaffected by this... it's only the Functor => Functor instance. If someone wants to treat a transformed monad as a functor, then they're probably savvy enough to specify the base monad as a functor (especially with the @fmap f = (>>= return . f)@ recipe). They won't even see a difference unless they are rolling their own monad, since all mtl monads are also functors.
I agree. I'd like to do the same thing with Applicative.
participants (2)
-
Nicolas Frisby
-
Ross Paterson