【问题标题】:The difference between comma and | in erlang逗号和|的区别在二郎
【发布时间】:2016-01-24 22:17:21
【问题描述】:

我正在尝试创建一个返回列表最后一个元素的函数。 但是这里有些奇怪。

last([X,[]]) -> X;
last([_X|Xs]) -> last(Xs).

这会返回一个不匹配的子句错误。但是,如果我将第一行更改为last([X|[]]) -> X;,它将正常工作。我认为这两条线的意思相同,但显然有不同的结果。我在这里错过了一些重要的事情吗?

【问题讨论】:

    标签: erlang pattern-matching


    【解决方案1】:

    逗号分隔列表元素,| 分隔列表的头部和尾部。 [X,[]] 是两个元素的列表,X 和空列表 []。但[X|[]] 是一个元素列表,X,尾部为空。

    顺便说一句,您可能只使用lists:last/1 而不是编写自己的函数。

    【讨论】:

    • 感谢您的建议。我这样做是因为我认为自己编写原始函数会更好地训练我的技能。另外,请问last([X]) -> X呢?它的工作方式与last[X|[]] 相同吗?
    • 是的。如果您进入 Erlang shell 并输入以下内容,您可以验证这一点:[1] = [1|[]].(这里我选择使用值1,但您可以使用任何值,只要它在= 的两边都相同) .这就像一个断言,声明[1] 与[1|[]] 匹配。结果表明这是真的;如果它们不匹配,我们将得到 badmatch 异常。
    • @user2129773 关于[1] = [1|[]],您可能会发现一些有关“缺点列表”概念的背景信息很有用。具备一些背景知识后,您将开始在各处以各种语言的各种语法识别这些结构:mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多