打印列表时 Erlang shell 冻结
Erlang shell freezes when printing a list
我在尝试打印列表时遇到了一个毫无头绪的问题。
该程序编译正常,但是当我 运行 它时,编译器卡住了,无法处理。这是代码片段:
print([]) -> [];
print([H|T]) -> [H]++print([T]).
我将列表拆分为头和尾,因为稍后我打算在其中实现更多操作。所以在那之前我只是想测试一下我是否可以打印一个列表作为用户输入。
我总是从一开始就将函数声明为 [print/1]
。也许我在其他地方搞砸了所以请指出。
发生这种情况是因为在递归调用之前将尾部包装到列表中。将 print([T])
更改为 print(T)
,它将起作用。
让我们来看看为什么会这样。考虑调用 print([42])
,只是一个元素来保持简单。由于列表在 Erlang 中的工作方式,这可以写成 [42 | []]
并且意思相同。
所以我们命中子句 print([H | T])
,H
是 42,T
是 []
。递归调用是 print([T])
,最终是 print([[]])
(一个包含空列表作为其唯一元素的列表)。
我们知道,[[]]
可以写成[[] | []]
。因此,递归调用再次进入 print([H | T])
子句, 而不是我们预期的 print([])
子句。现在,H
是 []
,T
是 []
。递归调用 print([T])
变为 print([[]])
... 我们有一个无限循环。
我在尝试打印列表时遇到了一个毫无头绪的问题。 该程序编译正常,但是当我 运行 它时,编译器卡住了,无法处理。这是代码片段:
print([]) -> [];
print([H|T]) -> [H]++print([T]).
我将列表拆分为头和尾,因为稍后我打算在其中实现更多操作。所以在那之前我只是想测试一下我是否可以打印一个列表作为用户输入。
我总是从一开始就将函数声明为 [print/1]
。也许我在其他地方搞砸了所以请指出。
发生这种情况是因为在递归调用之前将尾部包装到列表中。将 print([T])
更改为 print(T)
,它将起作用。
让我们来看看为什么会这样。考虑调用 print([42])
,只是一个元素来保持简单。由于列表在 Erlang 中的工作方式,这可以写成 [42 | []]
并且意思相同。
所以我们命中子句 print([H | T])
,H
是 42,T
是 []
。递归调用是 print([T])
,最终是 print([[]])
(一个包含空列表作为其唯一元素的列表)。
我们知道,[[]]
可以写成[[] | []]
。因此,递归调用再次进入 print([H | T])
子句, 而不是我们预期的 print([])
子句。现在,H
是 []
,T
是 []
。递归调用 print([T])
变为 print([[]])
... 我们有一个无限循环。