Erlang 中列表的定义在 in the manual 中给出 - 特别是第 2.10 节
在 Erlang 中,您真正需要了解的关于不正确列表的唯一一件事就是如何避免它们,而做到这一点的方法非常简单 - 完全取决于您要构建列表的第一件事在。以下所有内容都创建了正确的列表:
A = [].
B = [term()].
C = [term(), term(), term()].
在所有这些情况下,语法 确保有一个隐藏的“空”尾匹配到“[]”结尾。 ..
因此,以下操作都可以生成正确的列表:
X = [term() | A].
Y = [term() | B].
Z = [term() | C].
它们都是将新头添加到正确列表的操作。
有用的是您可以将X、Y 或Z 中的每一个输入到如下函数中:
func([], Acc) -> Acc;
func([H | T], Acc) -> NewAcc = do_something(H),
func(T, [NewAcc | Acc]).
当尾部的 hidden 空列表仅剩时,它们将撕开列表并终止于顶部子句。
当您的基本列表制作不正确时,问题就出现了,如下所示:
D = [term1() | term2()]. % term2() is any term except a list
这个列表没有有 hidden 空列表作为终端尾部,它有一个术语...
正如罗伯特·维丁在 cmets 中指出的那样,从这里向下是肉末
那么你如何为它写一个终结子句呢?
让人生气的是无法通过检查来判断列表是否不合适......打印出该死的东西看起来不错...... . 所以你最终创建了一个不正确的基本列表,在上面做一些事情,传递它,然后突然kabloowie你在错误所在的地方发生了几英里的崩溃,你拉着头发尖叫着喊...
但是你应该使用dialyzer为你嗅出这些小野兽。
道歉
根据罗伯特的评论,我尝试打印出一个不正确的列表,你瞧,很明显:
(arrian@localhost)5>A = [1, 2, 3, 4].
[1,2,3,4]
(arrian@localhost)5> B = [1, 2, 3 | 4].
[1,2,3|4]
(arrian@localhost)6> io:format("A is ~p~nB is ~p~n", [A, B]).
A is [1,2,3,4]
B is [1,2,3|4]
我曾经花了一些时间寻找一个不合适的列表,并说服自己它是不可见的,嗯 Ah ken noo!