这是因为在正确的列表中,[... | ...] 运算符的右侧应该是一个列表。左边的元素是附加或提取的头部元素的值,也可以是其他列表,没关系。左侧的最后一个元素指向右侧。这意味着在这种情况下,第一个元素与尾列表匹配
[A1, A2 | A1] = [[a], [b], a] = [[a], [b] | [a]] = [[a], [b]] ++ [a].
你不能写[a,b,c | d,e,f,g],你只能有一条尾巴。但是[a,b,c | [d,e,f,g]] 可以工作并且等于[a,b,c,d,e,f,g]。这意味着您使用值a 构造列表元素,它指向值b 的列表元素,它指向值c 的列表元素,它指向右侧(无论如何)。
其等效项(仅使用不带逗号的 | 运算符)是:
[a | [b | [c | [d | [e | [f | [g]]]]]]]。
要理解它,你应该这样想,而不是用逗号。
绑定示例:
[El1, El2 | Tail] = [a,b,c,d],
[El1 | [El2 | Tail]] = [a,b,c,d].
在这两种情况下El1 = a, El2 = b 和Tail = [c,d] = [c | [d]] = [c | [d | []]]。
如您所见,[[a],[b], a] 表示值为[a] 的列表元素(即值为a 的列表元素,它指向一个空列表[])指向一个值为[b] 的列表元素,它指向指向值为a 的列表元素,它指向一个空列表[]。
每个正确的列表最后一个元素都指向空列表[],所以[a,b,c] == [a,b,c | []]. 是真的
但是也有不正确的列表,您可以通过使用非列表作为尾部来构造它们,例如[a,b,c | d],但这仅在特定情况下有用,并且大多数列表操作不能应用于它们。一个用法示例是 lazy evaluation,其中 tail 是一个函数。
我刚刚发现了与您类似的问题,它是here。
如果还不清楚,您可能会发现关于 singly linked list 的 wiki 页面很有用。