【问题标题】:Erlang: head | tail from the end二郎:头|从头到尾
【发布时间】:2015-04-18 13:36:11
【问题描述】:

我刚开始使用 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:我知道我的例子是不正确的行为。

【问题讨论】:

  • 问自己为什么在 lisp 中答案是“否”可能会很有启发性(并不是说 Erlang 和很多 lisp 实现没有内置一些快捷方式)。一连串的骗局是什么样的?为什么每个人都避免使用foldr?等
  • 我理解并同意。很好的一点。然而,从纯粹递归的角度来看,从尾部或头部递归都是可取的。所以,我猜只是一厢情愿。
  • “纯递归”,当然,但不是“尾递归”,这确实是函数式语言的重点,也是数组和 lisp 样式的 conses 列表之间的区别所在玩。有点相关的讨论stackoverflow.com/questions/27459561/…
  • 感谢您指出其他讨论。绝对有用。

标签: list erlang


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的链接。
猜你喜欢
  • 2014-04-03
  • 2018-10-29
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2020-01-24
  • 2011-04-06
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多