【发布时间】:2016-01-24 22:17:21
【问题描述】:
我正在尝试创建一个返回列表最后一个元素的函数。 但是这里有些奇怪。
last([X,[]]) -> X;
last([_X|Xs]) -> last(Xs).
这会返回一个不匹配的子句错误。但是,如果我将第一行更改为last([X|[]]) -> X;,它将正常工作。我认为这两条线的意思相同,但显然有不同的结果。我在这里错过了一些重要的事情吗?
【问题讨论】:
我正在尝试创建一个返回列表最后一个元素的函数。 但是这里有些奇怪。
last([X,[]]) -> X;
last([_X|Xs]) -> last(Xs).
这会返回一个不匹配的子句错误。但是,如果我将第一行更改为last([X|[]]) -> X;,它将正常工作。我认为这两条线的意思相同,但显然有不同的结果。我在这里错过了一些重要的事情吗?
【问题讨论】:
逗号分隔列表元素,| 分隔列表的头部和尾部。 [X,[]] 是两个元素的列表,X 和空列表 []。但[X|[]] 是一个元素列表,X,尾部为空。
顺便说一句,您可能只使用lists:last/1 而不是编写自己的函数。
【讨论】:
last([X]) -> X呢?它的工作方式与last[X|[]] 相同吗?
[1] = [1|[]].(这里我选择使用值1,但您可以使用任何值,只要它在= 的两边都相同) .这就像一个断言,声明[1] 与[1|[]] 匹配。结果表明这是真的;如果它们不匹配,我们将得到 badmatch 异常。
[1] = [1|[]],您可能会发现一些有关“缺点列表”概念的背景信息很有用。具备一些背景知识后,您将开始在各处以各种语言的各种语法识别这些结构:mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html