原因列表: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