理由lists:flattenが機能しないのは、Erlangの文字列が小さな整数のリストにすぎないためです。リストが単なる文字列の場合、ネストされたリストでの再帰を停止する関数を使用してこれを処理できます。
文字列の任意にネストされたリストの場合、次の関数を使用できます。
slab([]) ->
[];
slab([F|R]) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end.
io_lib:char_list()を使用して、ネストの再帰が十分に深いかどうかを判断します。
操作の例:
1> slab([[["foo", "bar"], "baz", [[[["foobar"]]]], "froboz", "the end"]]).
["foo","bar","baz","foobar","froboz","the end"]
2>
混合ネストリストの使用を可能にする小さな改善:
slab([]) ->
[];
slab([F|R]) when is_list(F) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end;
slab([F|R]) ->
[F|slab(R)].
これはlists:flattenと同じように動作しますが、文字列をリストがないかのように処理する点が異なります。
1> slab([[["foo", "bar"], "baz", [[[["foobar", atom]],[a,b,c]]], 2, "froboz", "the end"]]).
["foo","bar","baz","foobar",atom,a,b,c,2,"froboz","the end"]