gpt4 book ai didi

list - 将 undefined 附加到列表

转载 作者:行者123 更新时间:2023-12-05 01:04:32 24 4
gpt4 key购买 nike

我正在调试一个错误,发现 undefined 被附加到一个列表中,这导致了后来的崩溃。

我预计使用 ++ 运算符附加列表以外的内容会导致崩溃。但对于 undefined 而言,情况并非如此。这是一个例子:

1> [1,2,3] ++ undefined.
[1,2,3|undefined]

虽然它没有崩溃,但该列表不再具有全部功能:

1> L = [1,2,3] ++ undefined.
[1,2,3|undefined]
2> L ++ [4].
** exception error: bad argument
in operator ++/2
called as [1,2,3|undefined] ++ [4]

为什么会这样?这与erlang中列表的底层实现有关吗?

最佳答案

原因是 ++ 将第二个参数附加到第一个参数的末尾,第一个参数必须是一个列表。它不对其第二个参数做任何处理,它只是按原样附加它。所以:

1> [1,2,3] ++ undefined.
[1,2,3|undefined]
2> [1,2,3] ++ [undefined].
[1,2,3,undefined]

您能做到这一点的原因:

3> [a|b].
[a|b]
4> [a|[b]].
[a,b]

列表是一个序列列表单元格,一个单链表,而不是一个单一的数据结构。如果每个单元格的右侧(称为尾部)是另一个列表单元格或[],那么您将得到一个正确的列表。每个单元格的左侧称为 head,通常包含列表的元素。这就是我们在上面的 2 和 4 中所拥有的。大多数(如果不是全部)库函数都假定列表是正确的列表,如果不是,则会产生错误。请注意,您必须实际将整个列表向下移动到末尾,以查看它是否正确。

每个列表单元格都写成[Head|Tail] 语法[a,b,c]只是[a|[的语法糖b|[c|[]]]]。请注意,每个列表单元格的尾部都是一个列表或 [],因此这是一个正确的列表。

对于列表单元格的头部和尾部可以是什么类型没有限制。系统从不检查它只是做它。这就是我们在上面的 1 和 3 中所拥有的,其中最后一个列表单元格的尾部(仅 3 中的列表单元格)不是列表或 []

抱歉在这里说教有点过头了。

编辑:我看到我已经在这里描述过:Functional Programming: what is an "improper list"?

关于list - 将 undefined 附加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14960851/

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