[erlang-questions] how: Another library flatten function?

Dmitry Belayev <>
Sat Feb 27 09:37:39 CET 2010


It would be best solution in non-strict language like haskell, but in 
erlang it is not tail-recursive, so it will use more memory.

Robert Virding wrote:
> Here are two very similar versions based on the code in lists.erl.
> They are both coded in a very straight forward style (I think) without
> reverse or append, but I haven't measured them.
>
> -module(ft).
>
> -export([fl1/2, fl2/2]).
>
> fl1([[C|_]=H|T], Tail) when is_integer(C) ->
>     [H|fl1(T, Tail)];
> fl1([H|T], Tail) when is_list(H) ->
>     fl1(H, fl1(T, Tail));
> fl1([H|T], Tail) ->
>     [H|fl1(T, Tail)];
> fl1([], Tail) -> Tail.
>
> fl2([[C|_]=H|T], Tail) when not is_integer(C) ->
>     fl2(H, fl2(T, Tail));
> fl2([[]|T], Tail) -> fl2(T, Tail);
> fl2([H|T], Tail) ->
>     [H|fl2(T, Tail)];
> fl2([], Tail) -> Tail.
>
> Robert
>
> 2010/2/26 Dmitry Belayev <>:
>   
>> How do you propose to remove lists:reverse? To use A ++ [I] in the second
>> clause? I don't think that would be optimal solution.
>>
>> Robert Virding wrote:
>>     
>>> I personally think this is the best solution, write your own function
>>> that is, as it is such a simple function to start with. Of course, I
>>> wouldn't use reverse but that is just a matter of detail. :-)
>>>
>>> Robert
>>>
>>> On 26 February 2010 16:50, Dmitry Belayev <> wrote:
>>>
>>>       
>>>> You can write your own:
>>>>
>>>> f(List) ->
>>>>  lists:reverse(f(List, [])).
>>>>
>>>> f([], A) ->
>>>>  A;
>>>> f([L|_]=I, A) when is_number(L) ->
>>>>  [I | A];
>>>> f([H|Tail], A) ->
>>>>  f(Tail, f(H, A)).
>>>>
>>>> Bengt Kleberg wrote:
>>>>
>>>>         
>>>>> Greetings,
>>>>>
>>>>> I have the following list: ["asd",[["Flow","kalle"]],["Sub","F"]]
>>>>> I would like to flatten it to: ["asd","Flow","kalle","Sub","F"]
>>>>> lists:flatten/1 is too effective. It gives me: "asdFlowkalleSubF"
>>>>>
>>>>> Is there another flatten somewhere?
>>>>>
>>>>>
>>>>> bengt
>>>>>
>>>>>
>>>>> ________________________________________________________________
>>>>> erlang-questions (at) erlang.org mailing list.
>>>>> See http://www.erlang.org/faq.html
>>>>> To unsubscribe; mailto:
>>>>>           



More information about the erlang-questions mailing list