Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 二郎:从头到尾_List_Erlang - Fatal编程技术网

List 二郎:从头到尾

List 二郎:从头到尾,list,erlang,List,Erlang,我刚开始学习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:我知道我的例子是不正确的行为。没有简洁的模式。您可以使用函数li

我刚开始学习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:last
lists:droplast
,它们遍历整个列表以查找尾部:

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

如果要对长列表执行此操作,可能需要编写一个只遍历列表一次但同时返回新列表和最后一个元素的函数。这可以作为灵感。

感谢这些链接。问问自己为什么在lisp中答案是“否”可能会很有启发性(不是说Erlang和很多lisp实现没有内置一些快捷方式)。一连串的消费是什么样子的?为什么每个人都回避foldr?我理解并同意。很好。然而,从纯粹递归的角度来看,从尾部或头部递归都是可取的。所以,我想这只是一厢情愿。“纯递归”,当然,但不是“尾部递归”,这才是函数式语言中真正的要点,也是数组和lisp风格的conse列表之间的区别发挥作用的地方。有些相关的讨论感谢您指出其他讨论。绝对有用。