Changed deriving of Functor, Foldable, Traversable to fix #7436. Added foldMap to...
authorTwan van Laarhoven <twanvl@gmail.com>
Fri, 23 Nov 2012 14:03:45 +0000 (15:03 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 4 Jan 2013 10:48:59 +0000 (10:48 +0000)
commit49ca2a37bef18aa57235ff1dbbf1cc0434979b1e
tree7a4abf2c4cb719c362610de7160c9ef64fe97bcb
parentfbff64a414182800ea474a83f414a312dcc52fa5
Changed deriving of Functor, Foldable, Traversable to fix #7436. Added foldMap to derived Foldable instance.

The derived instances will no longer eta-expand the function. I.e. instead of
    fmap f (Foo a) = Foo (fmap (\x -> f x) a)
we now derive
    fmap f (Foo a) = Foo (fmap f a)

Some superflous lambdas are generated as a result. For example
    data X a = X (a,a)
    fmap f (X x) = (\y -> case y of (a,b) -> (f a, f b)) x
The optimizer should be able to simplify this code, as it is just beta reduction.

The derived Foldable instance now includes foldMap in addition to foldr.
compiler/prelude/PrelNames.lhs
compiler/typecheck/TcGenDeriv.lhs