gpt4 book ai didi

erlang - 理解顺序 Erlang 的问题

转载 作者:行者123 更新时间:2023-12-04 21:57:53 24 4
gpt4 key购买 nike

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

seq([X, X | Xs]) -> [X | seq(Xs)];
seq([X, Y | Xs]) -> [X, Y | seq(Xs)];
seq(_) -> [].

当我使用 [1,1,1,2,2,2,3] 在 shell 中运行它时,我得到 [1,1,2,2]。我一直试图通过写在纸上来理解这些步骤,但我被卡在了一半的低谷。

我将不胜感激所有解释我这里发生的步骤的答案! :)
/埃里。

最佳答案

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

第一次调用 seq , erlang 将匹配前两个元素 11seq 的第一个“子句” - seq([X, X | Xs]) .
这将初始化将成为最终返回值的列表 [1, seq(Xs)] .现在到了 Xs将绑定(bind)到值 [1,2,2,2,3] .如果您想知道为什么 Xs 列表的开头没有两个 1,那是因为我们在 [X, X | Xs] 上匹配/绑定(bind)了其中的两个。 .

返回值 = [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] ,所以 erlang 将运行我们的包罗万象:seq(_) -> []. _将匹配任何内容,并且不会将值绑定(bind)到任何局部变量,所以我们在这里所做的只是返回一个空列表 [] .

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

关于erlang - 理解顺序 Erlang 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com