Reputation: 25763
If I have a list of functions, each of the type a -> a
for some type, what is the most shortest, elegant and idiomatic way to combine them; preferably without adding extra dependencies?
Some variants include
foo (x:xs) = x . (foo xs)
foo [] = id
and
foo = foldr (.) id
and
foo = appEndo . mconcat . map Endo
but for some reason I’m expecting to find something nicer.
Upvotes: 4
Views: 496
Reputation: 18189
Another one, which may not be shorter than foldr (.) id
but which I think is cute:
foo = flip (foldr id)
Upvotes: 6
Reputation: 53871
I'd say you're not going to beat
comp = foldr (.) id
Why? Well we have a list of things and we're trying to reduce it in a right associative way.
If you look at the implementations of and
, sum
, maximum
and similar, you'll see that this is how they're implemented in the standard library, I don't think you get more idiomatic than that :)
Tangent: I hesitate to add the foldr1
variant mentioned in comments because I'd say that it's unexpected behavior for this to be partial, unlike say maximum
where it clearly must be.
Upvotes: 19