[erlang-questions] [erlang-question] How to comprehend two lists synchronously?
Ryan Huffman
ryanhuffman@REDACTED
Fri Nov 18 07:45:11 CET 2011
If you wanted to be able to do n-lists I don't think there is a
"pretty" way to do it. You could modify Dmitry's suggestion:
mapn(Fun, Lists) ->
mapn(Fun, Lists, []).
mapn(_Fun, [[] | _], MappedList) ->
lists:reverse(MappedList);
mapn(Fun, Lists, MappedList) ->
{HeadElements, RestLists} = lists:foldl(
fun([H | Rest], {HeadElements, RestLists}) ->
{[H | HeadElements], [Rest | RestLists]}
end, {[], []}, Lists),
Value = Fun(HeadElements),
mapn(Fun, lists:reverse(RestLists), [Value | MappedList]).
and call it like so:
mapn(fun(L) -> lists:sum(L) end, [[1,2,3],[4,5,6],[7,8,9]]).
Ryan
On Thu, Nov 17, 2011 at 10:38 PM, Barco You <barcojie@REDACTED> wrote:
> Hi Dmitry,
> What your suggested can really solve my problem, but it's not
> Tail-Recursion. The tail-recursed solution should look like this;
> map2(_Fun, [], []) ->
> [];
> map2(Fun, L1, L2) ->
> map2(Fun, L1, L2, []).
> map2(_Fun, [], [], L) ->
> lists:reverse(L);
> map2(Fun, [H1 | T1], [H2 | T2], L) ->
> map2(Fun, T1, T2, [Fun(H1, H2) | L]).
>
> However, I'm still disappointed with the list comprehension which is
> different from what I intuitively imagine about it.
>
> Regards,
> Barco
> On Fri, Nov 18, 2011 at 1:49 PM, Dmitry Demeshchuk <demeshchuk@REDACTED>
> wrote:
>>
>> My guess is you have to zip them together, or just write a
>> tail-recursed function:
>>
>> map2(Fun, [H1 | T1], [H2 | T2]) ->
>> [Fun(H1, H2) | map2(Fun, T1, T2)];
>> map2(Fun, [], []) ->
>> [].
>>
>> The second option definitely isn't a list comprehension, but it
>> requires less memory and has lesser complexity.
>>
>> On Fri, Nov 18, 2011 at 9:45 AM, Barco You <barcojie@REDACTED> wrote:
>> > Dear Erlangers,
>> >
>> > I hope to get a list from two lists like this:
>> > [{a1,b1}, {a2,b2}, {a3,b3}] <- [a1, a2 a3], [b1, b2, b3].
>> > But if I use list comprehension, I got:
>> > 10> [{D1,D2} || D1 <- [a1,a2,a3], D2 <- [b1,b2,b3]].
>> > [{a1,b1},
>> > {a1,b2},
>> > {a1,b3},
>> > {a2,b1},
>> > {a2,b2},
>> > {a2,b3},
>> > {a3,b1},
>> > {a3,b2},
>> > {a3,b3}]
>> >
>> > So, my questions is how to comprehend list in synchronous way in order
>> > to
>> > get what I want, rather than to compose the elements from two lists in
>> > all
>> > possible situations.
>> >
>> > Thank you,
>> > Barco
>> > _______________________________________________
>> > erlang-questions mailing list
>> > erlang-questions@REDACTED
>> > http://erlang.org/mailman/listinfo/erlang-questions
>> >
>> >
>>
>>
>>
>> --
>> Best regards,
>> Dmitry Demeshchuk
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
More information about the erlang-questions
mailing list