SML中是否有操作符允许我附加到列表而不必创建新列表?例如
我无法做到这一点:
[1,2,3]::1
但我可以这样做:
[1,2,3]@[1]
这很奇怪,因为我必须创建一个包含1的列表。有没有更好的方法呢?
答案 0 :(得分:5)
您必须以任一方式创建一个包含一个列表的列表。 [1,2,3,1]
尾部尾部的尾部是[1]
。因此,如果你的内存中有[1,2,3,1]
,那么你的内存中也会有[1]
。
所以,即使有像[1,2,3] @:: 1
这样的运营商,它也不会有所作为,因为它仍然需要创建一个包含一个列表的列表。
PS:xs @ [x]
的真正问题不在于列表的创建,而是其运行时在O(n)中(与x :: xs
相对的事实,即O(1))。这也是不可变单链表的本质所固有的问题,因此无法得到帮助,但这就是为什么你通常应该避免附加到这样的列表的末尾。
答案 1 :(得分:1)
[1,2,3]::1
尝试将int列表[1,2,3]
附加到整数值1
中,这是不可能的,因为无法将整数附加到。{
但是,1::[1,2,3]
完全有效,因为列表[1,2,3]
支持附加操作。 ::
的评估规则需要t1 :: t1 list
,其中t1是类型1的值,t1列表是类型1的列表,您正在做的是t1 list :: t1
。<登记/>
[1,2,3] @ [1]
有效,因为您要将列表附加到列表中。