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.

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

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:

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.

lists:flatten([a, [1, [b, [2]]]], [x, y, z]). % [a,1,b,2,x,y,z]

–Proctor