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.
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.
Another one, which may not be shorter than foldr (.) id
but which I think is cute:
foo = flip (foldr id)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With