Erlang article #1 on

Richard A. O'Keefe ok@REDACTED
Fri Aug 18 04:16:20 CEST 2006

I mentioned the
    (let N = 0 then N+1, S = 0 then S+X
     for X <- List, X > 0
     in  S/N
construct that had been designed recently in this mailing list.

"Ryan Rawson" <ryanobjc@REDACTED> wrote:
	That's more of a list comprehension than a loop now is it?

It's as loopy a for loop as ever there was.
List comprehensions make lists.
This kind of loop *may* make a list, but needn't.

    [ E(X) || X <- L, G(X) ]

can be expressed in this form as

    (let R = [] then [E(X)|R]
     for X <- L, G(X)
     in  reverse(R)

You can think of this as a multi-result fold + map + filter.
In other words, you can think of it as a for loop.

If you think a 'for' loop must have something to do with counting,
reflect that a compiler might recognise X <- lists:seq(1, N) and
do something special with it (if you promise faithfully not to change
the semantics of seq/2 next time you reload the lists module, of course...).

More information about the erlang-questions mailing list