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

Dmitry Belayev <>
Sat Feb 27 09:42:48 CET 2010


Shame on me, my own version uses f(_, f(_)) so it is not-tail recursive too.

Dmitry Belayev wrote:
>
> 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:
>>>>>>           
>
>
> ________________________________________________________________
> 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