
G'day all.
Quoting David Menendez
This is pretty much how I define Functor and Applicative instances for my monads. It is admittedly irritating to have to write out the boilerplate, but it doesn't seem irritating enough to require a language extension to eliminate.
In the case of Functor and Applicative, that's true. Cases where it's likely to be more useful involve absurdly fine-grained class hierarchies, like the numeric prelude. Getting fanciful for a moment, and not claiming that this is a good structure: class Plus a b c | a b -> c where (+) :: a -> b -> c class Minus a b c | a b -> c where (-) :: a -> b -> c class Times a b c | a b -> c where (*) :: a -< b -> c class Zero a where zero :: a class One a where one :: a class (Zero a, Plus a a a, Minus a a a) => Additive a where negate :: a -> a negate a = zero - a a - b = a + negate b class (Mul a a a, One a) => Multiplicative a where (^) :: a -> Integer -> a class (Multiplicative a, Additive a) => Ring a where fromInteger :: Integer -> a zero = fromInteger 0 one = fromInteger 1 class (Ring a, Ord a) => OrderedRing a where abs :: a -> a abs x = x `max` negate x signum :: a -> a -- etc class (OrderedRing a, Show a) => Num a You can imagine how unwieldy this would now get if you just wanted to declare an instance for Num a. Cheers, Andrew Bromage