
Hmmm, I seem to have missed part of this conversation, but I’ll toss in my two cents anyhow:
Consider the identities
foldl (•) s [x,y,z] == ((s•x)•y)•z
foldr (•) s [x,y,z] == x•(y•(z•s))
and I think it should be clear that the type of (•) must be a→b→a in the former and b→a→a in the latter.
Either of these identities would look rather odd when written in operator notation if (•) were flipped!
– Harald
-----Original Message-----
From: Martin Vlk
I think again this technically doesn't matter...
I'm curious if this could be for the sake of making the types of the two functions (foldr/foldl) different? E.g. so that you can tell from the type what function it is.
(I'm a Haskell beginner myself so would be curious to hear an expert's voice on this!)
Martin
martin:
foldl :: (a -> b -> a) -> a -> [b] -> a foldr :: (a -> b -> b) -> b -> [a] -> b
For once the list is a list of as in foldl, but a list of as in foldr. Now that can be fixed with renaming the type parameters
foldr :: (b -> a -> a) -> a -> [b] -> a
this is the exact same thing and resembles more the type of foldl. But still the function argument has its parameters flipped. foldl's function takes the list element as second parameter and foldr's takes it as first parameter.
Why is that so?
Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Harald Hanche-Olsen Førsteamanuensis Institutt for matematiske fag Norges teknisk-naturvitenskapelige universitet 7491 Trondheim http://www.math.ntnu.no/~hanche/