所以我一直试图在我的模块中实现这个功能,到目前为止我得到了这个:
示例1.
[2,[3,[4,[5,[6,[7,[8,[]]]]]]]]
我试图找出如何让它看起来像一个正确的列表,即:
示例2.
[2,3,4,5,6,7,8].
我知道我必须玩Heads and Tails,但我很难理解它。 任何帮助,将不胜感激。
谢谢!
答案 0 :(得分:7)
实际上,在示例1中,您显示了正确的列表。列表只包含2个元素 - 数字和另一个列表。
不正确的列表是不同的 - 例如[1 | 2]。
您可以通过列表将示例1转换为示例2:flatten。
1> M = [2,[3,[4,[5,[6,[7,[8,[]]]]]]]].
[2,[3,[4,[5,[6,[7,[8,[]]]]]]]]
2> lists:flatten(M).
[2,3,4,5,6,7,8]
答案 1 :(得分:3)
问题的根源在于您如何构建列表。你在这里有什么:
[2,[3,[4,[5,[6,[7,[8,[]]]]]]]]
不是一个列表,而是嵌套列出了两个元素。执行[Element,List]
时,不会将Element
添加到List
,但会构建一个新列表,其中Element
为第一个元素,List
}作为第二个元素。请注意,每个列表 都是正确的列表,但您没有构建一个列表但是嵌套列表。
要将Element
添加到List
,请使用语法[Element | List]
。所以:
[2|[3|[4|[5|[6|[7|[8|[]]]]]]]]
构建列表[1,2,3,4,5,6,7,8]
。
所以[Element | List]
和[Element,List]
是两个非常不同的东西,第一个元素在列表的开头预置,而第二个元素构建一个新的两个元素列表。没有重建列表就没有直接的方法将元素附加到列表中。
答案 2 :(得分:1)
不像最初看起来那么明显,但这是一种手动的方式来做什么列表:flatten / 1(在这种特殊情况下,它更有趣):
proper(L) -> proper([], L).
proper(A, [H|[T]]) -> proper([H|A], T);
proper(A, []) -> lists:reverse(A).