The Erlang notation [ F(X) || X <- L] means "the list of F(X) where X is taken from the list L."
1> L = [1,2,3,4,5]. [1,2,3,4,5] 2> [2*X || X <- L ]. [2,4,6,8,10]
Thus, [2*X || X <- L ] means "the list of 2*X where X is taken from the list L."
There's tons of other really really cool stuff you can do. Like qsort(L) for quick sorting lists:
qsort([]) -> []; qsort([Pivot|T]) -> qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).
Or perms(S) for generating all possible permutations of a string:
perms([]) -> [[]]; perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
Or pythag(N) for generating all Pythagorean triplets (sets of integers {A,B,C} where A2 + B2 = C2):
pythag(N) ->
[ {A,B,C} ||
A <- lists:seq(1,N),
B <- lists:seq(1,N),
C <- lists:seq(1,N),
A+B+C =< N,
A*A+B*B =:= C*C
].
Ad infinitum into the wee hours of the morning...