【问题标题】:Sequential Erlang misunderstanding顺序 Erlang 的误解
【发布时间】:2014-08-29 08:45:37
【问题描述】:

我这里有这个例子,我用 1, [1, 2, 3, 1, 4, 1] 运行它

example(_, []) -> [];
example(X, [X | Rest]) -> Rest;
example(X, [Y | Rest]) -> [Y | example(X, Rest)].

在我的头脑中(附在我的身体上)我得到 [2,3,4] 但编译器说 [2,3,1,4,1]。怎么来的?要么是我太累了,要么是我没有正确理解这些东西。

感谢您的帮助!

【问题讨论】:

    标签: erlang


    【解决方案1】:

    好吧,由于您的第一个参数与列表的头部匹配,因此使用了第二个重载,导致Rest,即[2,3,1,4,1],结束了“递归”。一如既往,编译器是对的;)

    也许您想改为写example(X, [X | Rest]) -> example(X, Rest)?这确实会删除所有1s 而不仅仅是第一个。

    【讨论】:

      【解决方案2】:

      子句从上到下匹配。

      你打电话给example(1, [1,2,3,1,4,1])

      首先,erlang 会尝试再次匹配(_,[])。这将失败,因为您的第二个参数不是空列表。

      第二场比赛将对阵(X,[X | Rest)X 绑定到1,所以第二个参数“是”现在[1 | Rest]。这将使与[1,2,3,1,4,1] 的匹配成功,因为第一个列表项是1X 的值)。

      【讨论】:

        【解决方案3】:

        你可以试试:

        example(_, []) -> [];
        example(X, [X | Rest]) -> example(X, Rest);
        example(X, [Y | Rest]) -> [Y | example(X, Rest)].
        

        wy:example(1, [1,2,3,1,1]). 将删除所有元素 1。

        【讨论】:

        • 这个晚了 3 个小时,与 Krab 和我的现有答案相比,绝对没有包含任何额外信息。
        猜你喜欢
        • 2014-02-03
        • 2018-12-08
        • 1970-01-01
        • 2014-06-13
        • 2012-05-27
        • 2021-05-28
        • 2020-02-12
        • 1970-01-01
        • 2011-10-14
        相关资源
        最近更新 更多