Hacker News new | past | comments | ask | show | jobs | submit login

> Now, in this case, this is a silly operation, since foldr (:) [] is just a complicated identity function on lists, but we could imagine a slightly more complicated function, such as one that doubles each element in a list.

This whole post is great, but this part would be less awkward and easier to understand with a simpler example of more practical use like:

  and = foldr (&&) True
or

  all f = foldr (&&) True . map f
x && y doesn't evaluate y if x is False.



Maybe, but foldr (:) [] ~ id is an illuminating fact in its own right that is worth pausing to understand.


To spell things out a bit more: A list is fundamentally constructed from [] and :. In the sense that a list is either empty [] or a head : tail, where tail is another list.

One might write 1:2:3:4:[].

foldr is deciding where to map [] and :. So for example:

  [] => 0
  : => +
Turns the above list into 1+2+3+4+0.

With that understanding, foldr (:) [] becomes:

  [] => []
  : => :
which is fairly clearly the identity.


> foldr is deciding where to map [] and :

This is a way better explanation than the cryptic:

    " it (foldr) takes the second argument and the last item of
    the list and applies the function, then it takes the 
    penultimate item from the end and the result, and so on.
    See scanr for intermediate results. "


It absolutely is. It is the basis for the build/foldr stream fusion built into the standard library.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: