原因列表: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(),以决定是否嵌套递归是足够深。
Exampe操作:
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)].
这种行为就像列表:扁平化,除了它处理字符串如果他们将没有列表:
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"]
谢谢!它的工作原理:) – ErJab 2010-05-26 09:28:59
如果你想要一个更通用的方法,你可能想看看io_lib:printable_list/1。即如果列表不可打印,则只能变平。 – Lukas 2010-05-26 09:47:31
'list:foldl(fun erlang:'++'/ 2,[],List)'更短。 – nox 2013-01-16 16:36:37