理解顺序Erlang的问题

Eri*_*ri. 4 erlang

我一直在研究一个代码示例,我无法理解发生了什么,我试图理解更简单的例子并得到它们但是在这一点我被卡住了:

seq([X, X | Xs]) -> [X | seq(Xs)];
seq([X, Y | Xs]) -> [X, Y | seq(Xs)];
seq(_) -> [].
Run Code Online (Sandbox Code Playgroud)

当我用[1,1,1,2,2,2,3]在shell中运行它时,得到[1,1,2,2].我一直试图通过将它写在纸上来理解这些步骤,但我陷入了困境.

我很感激所有答案向我解释这里发生的步骤!:)/Eri.

Ale*_*ore 11

好的,我们从列表开始[1,1,1,2,2,2,3].

在第一次调用seq,二郎将匹配前两个元素1,并1以第一个"条款" seq- seq([X, X | Xs]).这将初始化将成为最终返回值的列表[1, seq(Xs)].现在此时Xs将绑定到该值[1,2,2,2,3].如果你想知道为什么在Xs列表的开头没有两个1,那是因为我们匹配/绑定了其中两个[X, X | Xs].

返回值 = [1 | ?] (?是要评估的剩余递归)
Xs =[1,2,2,2,3]

在第二次调用时seq,erlang将匹配输入列表的前两个元素12第二个子句seq([X, Y | Xs]).然后我们从该运行中"返回"列表[X,Y]或[1,2],并使用Xs = [2,2,3]调用下一次迭代.

返回值 = [1 | [1, 2 | ?]] < - 查看递归如何嵌套列表?
Xs =[2,2,3]

在第三次调用时,前两个元素再次相同,因此erlang再次运行第一个子句. seq([X, X | Xs]) -> [X | seq(Xs)].我们返回一个2值作为评估的一部分,然后调用seq([3]).

返回值 = [1 | [1, 2 | [2 | ?]]]
Xs =[3]

最后,最后的案例.我们的名单[3]不匹配[X, X | Xs],也没有[X, Y, Xs],所以二郎将运行我们的包罗万象的:seq(_) -> []. _将匹配任何东西,而不是值绑定到任何局部变量,所以我们在这里做的是返回一个空列表[].

我们的最终回报值是: [1 | [1, 2 | [2 | []]]].如果你将它评估为你的erl repl,你会看到它与列表相同[1,1,2,2],后者是前者的语法糖.