Today’s Erlang Thursday function is lists:flatten/1.
lists:flatten/1
flattens out an arbitrarily deep list of Erlang terms, into a “flattened” list.
1 2 3 4 5 6 7 8 | lists:flatten ([]). % [] lists:flatten ([a, b, c]). % [a,b,c] lists:flatten ([a, b, [1, [x, y], 3], c]). % [a,b,1,x,y,3,c] lists:flatten ([a, b, [1, [x, {some, tuple}], 3], c]). % [a,b,1,x,{some,tuple},3,c] |
Be warned though, it flattens out all lists, as seen here
1 2 | lists:flatten ([a, "foo" , b]). % [a,102,111,111,b] |
You get the above lists with numbers in it, because under the covers, a string is just a list of integers, so you get the ASCII character codes for the letters f
and o
in "foo"
.
If you want the string to “remain”, you need to use the string as a binary type like this:
1 2 | lists:flatten ([a, << "foo" >>, b]). % [a,<<"foo">>,b] |
And as a bonus, there is also a lists:flatten/2
, that takes a list to flatten, and another argument tail
, which is the value to append to the newly flattened list.
1 2 | lists:flatten ([a, [1, [b, [2]]]], [x, y, z]). % [a,1,b,2,x,y,z] |
–Proctor