Proposal: alpha-rename the type signatures of foldl, foldl', and scanl to be consistent with foldr and scanr
Gábor Lehel
illissius at gmail.com
Sun Oct 14 16:28:58 CEST 2012
Currently we have:
foldl :: (a -> b -> a) -> a -> [b] -> a
foldr :: (a -> b -> b) -> b -> [a] -> b
I find this confusing. My brain doesn't do automatic alpha-renaming,
so I end up thinking that these types are very different because they
look very different. In fact, they are almost the same.
Embarrassingly, it took me longer than it took to understand monads,
GADTs, PolyKinds, and several other things before I realized it!
So I propose that we use 'a' consistently to denote the type of the
list elements, and 'b' to denote the type of the result:
foldl :: (b -> a -> b) -> b -> [a] -> b
foldr :: (a -> b -> b) -> b -> [a] -> b
making it obvious that the only difference is the order of parameters
to the accumulator.
The total change would be to replace
Prelude.foldl :: (a -> b -> a) -> a -> [b] -> a
Prelude.scanl :: (a -> b -> a) -> a -> [b] -> [a]
Data.List.foldl' :: (a -> b -> a) -> a -> [b] -> a
Data.Foldable.foldl :: (a -> b -> a) -> a -> t b -> a
Data.Foldable.foldl' :: (a -> b -> a) -> a -> t b -> a
with
Prelude.foldl :: (b -> a -> b) -> b -> [a] -> b
Prelude.scanl :: (b -> a -> b) -> b -> [a] -> [b]
Data.List.foldl' :: (b -> a -> b) -> b -> [a] -> b
Data.Foldable.foldl :: (b -> a -> b) -> b -> t a -> b
Data.Foldable.foldl' :: (b -> a -> b) -> b -> t a -> b
I've attached a patch.
Discussion period: 2 weeks
Previously discussed at: http://www.reddit.com/r/haskell/comments/10q2ls/
--
Your ship was destroyed in a monadic eruption.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-alpha-rename-the-type-signatures-of-foldl-foldl-and-.patch
Type: application/octet-stream
Size: 3378 bytes
Desc: not available
URL: <http://www.haskell.org/pipermail/libraries/attachments/20121014/9fa894f7/attachment.obj>
More information about the Libraries
mailing list