从Erlang中的不正确列表返回第一个元素

时间:2014-09-11 10:22:28

标签: list erlang head tail

所以我一直试图在我的模块中实现这个功能,到目前为止我得到了这个:

示例1.

[2,[3,[4,[5,[6,[7,[8,[]]]]]]]]

我试图找出如何让它看起来像一个正确的列表,即:

示例2.

[2,3,4,5,6,7,8].

我知道我必须玩Heads and Tails,但我很难理解它。 任何帮助,将不胜感激。

谢谢!

3 个答案:

答案 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).