Question

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.

Was it helpful?

Solution

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.

OTHER TIPS

Another one, which may not be shorter than foldr (.) id but which I think is cute:

foo = flip (foldr id)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top