
I like to add that if you define a class for structures and according element types that support both foldl and foldr, and you are not using the RMonad trick, then the name of the types really matter: class Foldable v a b where foldl :: (a -> b -> a) -> a -> v b -> a foldr :: (a -> b -> b) -> b -> v a -> b The accumulator type would not need to be storable in the structure 'v' but if the Fold class uses the variable names from the Prelude then both accumulator and element type are constrained. I think the accumulator should not be named 'r' because there are many result types in the List module that are not named 'r' and should not be, for instance because argument and result have the same type or are just Int or Bool. The distinguishing feature of a result type is that it is the last type in a chain of arrows, but you can hardly express this using the variable name.