
Hi, I was browsing through the source code for Data.Foldable and having trouble comprehending it (which was kind of the point of browsing the code, so I could learn something ;) ) I'm looking at foldl foldl :: (c -> d -> c) -> c -> t d -> c foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z But, I haven't got very far. I'm still trying to follow: Endo . flip f f is of type c->d->c, so this makes flip f of type d->c->c. I think the Endo constructor is of type (a->a)->Endo a I think a is binding to a function type here, but can not work out what. (From memory) ghci reports
:t Endo . flip (+) Num a => a -> Endo a
So, this looks like a partial application of the constructor? But, this still isn't helping me understand. Any thoughts or pointers that might help me comprehend what's happening? Thanks, Levi lstephen.wordpress.com