逗号和|的区别在二郎
Posted
技术标签:
【中文标题】逗号和|的区别在二郎【英文标题】:The difference between comma and | in erlang 【发布时间】:2016-01-24 22:17:21 【问题描述】:我正在尝试创建一个返回列表最后一个元素的函数。 但是这里有些奇怪。
last([X,[]]) -> X;
last([_X|Xs]) -> last(Xs).
这会返回一个不匹配的子句错误。但是,如果我将第一行更改为last([X|[]]) -> X;
,它将正常工作。我认为这两条线的意思相同,但显然有不同的结果。我在这里错过了一些重要的事情吗?
【问题讨论】:
【参考方案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以上是关于逗号和|的区别在二郎的主要内容,如果未能解决你的问题,请参考以下文章