【发布时间】: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/…
-
感谢您指出其他讨论。绝对有用。