[erlang-questions] Suggestion for the Mnesia manual

Kostis Sagonas <>
Mon May 5 13:05:17 CEST 2008


Jouni Rynö wrote:
> So from analysis point of view, recursion still would be better? (sorry,
> deleted the original example, but this was directly from my own code,
> revealed by dialyzer ...)
> 
> Instead of this (dialyzer tells me, that it produces value of type
> ['ok'])
> [ok = gen_server:cast(Client, {parameter, Para}) || Client <-
> ClientList]
> 
> use the recursion
> serve_clients(Message, [Client|ClientList]) ->
> 	ok = gen_server:cast(Client, Message),
>           serve_clients(Message, ClientList);
> serve_clients(Message, []) ->
> 	ok.

The best way to write the above is using lists:foreach/2 as in:

   lists:foreach(fun (Client) ->
	           gen_server:cast(Client, {parameter, Para})
                 end, Clients)

which achieves what you want, in my opinion expresses the intention of 
the programmer clearer than a comprehension and makes dialyzer happy.

Kostis


PS. I am aware that in R12B, lists comprehensions are compiled in such a
     way that a list for the result is not constructed when the result is
     not used, but this is just a compiler optimization which happens at
     a later stage - not something formally defined in the language or in
     Core Erlang.



More information about the erlang-questions mailing list