二郎:头|从尾巴

Erlang: head | tail from the end

我刚刚开始使用 Erlang(尽管有一些 lisp 背景)并且对列表上的模式匹配有疑问。

如果我说

[Head | Tail] = [1, 2, 3].

然后我得到

Head = 1
Tail = [2, 3]

如果我想从另一端做同样的事情而不颠倒列表两次,是否有一些简洁的模式?我希望能够这样说:

[All_but | last] = [1, 2, 3].

并得到:

All_but = [1, 2]
last = 3

谢谢。

PS:我知道我的例子是不正确的行为。

对此没有简洁的模式。您可以使用函数 lists:lastlists:droplast,它们遍历整个列表以找到尾部:

> lists:last([1,2,3]).
3
> lists:droplast([1,2,3]).
[1,2]

如果您要对长列表执行此操作,您可能希望编写一个只遍历列表一次但 returns 遍历新列表和最后一个元素的函数。 source code for lists:last and lists:droplast 可以作为灵感。