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)].
它的行为就像 list: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"]