【问题标题】:Returning a first element from an improper list in Erlang从 Erlang 中的不正确列表中返回第一个元素
【发布时间】:2014-09-11 10:22:27
【问题描述】:

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

示例 1。

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

我想弄清楚如何使它看起来像一个正确的列表,即:

示例 2。

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

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

谢谢!

【问题讨论】:

  • 我想知道接下来我应该做什么,也就是解决我的问题的第二行。
  • 你写道你很难理解需要什么,所以我写了一个手动解决方案——但 Odobenus Rosmarus 的回答是正确的,因为这确实已经是一个正确的列表。

标签: list erlang head tail


【解决方案1】:

实际上,在示例 1 中,您显示了正确的列表。仅包含 2 个元素的列表 - 数字和另一个列表。

不正确的列表是另一回事 - 例如 [1|2]。

您可以通过 lists:flatten 将示例 1 变成示例 2。

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]

【讨论】:

    【解决方案2】:

    问题的根源在于你是如何建立你的清单的。你在这里有什么:

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

    不是一个列表,而是两个元素中的每一个的嵌套列表。当您执行[Element,List] 时,这NOTElement 添加到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] 是两个非常不同的东西,第一个将一个元素添加到列表的开头,而第二个构建一个包含两个元素的新列表。如果不重新构建列表,就无法直接将元素附加到列表中。

    【讨论】:

      【解决方案3】:

      不像最初看起来那么明显,但这是一种手动方式来执行 lists:flatten/1 所做的事情(在这种特殊情况下,它更有趣):

      proper(L) -> proper([], L).
      
      proper(A, [H|[T]]) -> proper([H|A], T);
      proper(A, []) -> lists:reverse(A).
      

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2019-05-20
        • 2020-07-25
        • 2021-07-07
        • 2016-09-26
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多