Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Most idiomatic implementation of `[a -> a] -> (a -> a)`

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.

like image 657
Joachim Breitner Avatar asked Nov 29 '22 01:11

Joachim Breitner


2 Answers

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.

like image 123
Daniel Gratzer Avatar answered Dec 10 '22 13:12

Daniel Gratzer


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

foo = flip (foldr id)
like image 39
Ørjan Johansen Avatar answered Dec 10 '22 12:12

Ørjan Johansen