
On 2016-04-30 at 15:14, Silent Leaf
I think I got what exactly was the change of ghc 7.10. basically it only adds a constraint Applicative on the Monad class, and same with Functor/Applicative.
7.10 adds the constraint on the Monad class. Prior to 7.10, both Monads and Applicatives already needed to be Functors.
Otherwise it's forcing the programmer to do even more possibly-useless work (we don't always need applicative and functors for every use of a new monad, do we?)
The practical advantage comes when I want to write some code that is generic over Monads. If I can't assume that every Monad is Applicative, my choices are: 1) Write (Applicative m, Monad m) =>, and not work for those Monads 2) Write `ap` everywhere I mean <*>, which for some instances is less efficient 3) Write two versions, one like (1) and one like (2) None of these are very appealing, and orphan instances are a pain, so there's already strong social pressure that any Monad instance on Hackage should have the corresponding Applicative instance defined.
in short i think if they wanted mathematical correctness they should have added automatic instanciation of superclasses, with possibility to override the default definitions, like they do so with some superfluous methods.
Several ways of automatically defining superclasses were discussed as part of the AMP changes. Maybe we'll get one in some future GHC. I don't know the details, but some of the discussion: https://ghc.haskell.org/trac/ghc/wiki/IntrinsicSuperclasses https://ghc.haskell.org/trac/ghc/wiki/DefaultSuperclassInstances https://ghc.haskell.org/trac/ghc/wiki/InstanceTemplates
Not that write functors or applicative functor instances is actually heavywork, of course, thankfully.
You know that if the instances are all in the same module, you can use the Monad functions, right? So the extra work is just pasting in: instance Functor m where fmap = liftM instance Applicative m where pure = return (<*>) = ap