SML:如何在SML中将元素追加到列表中?

时间:2017-02-09 22:26:33

标签: sml

SML中是否有操作符允许我附加到列表而不必创建新列表?例如

我无法做到这一点:

 [1,2,3]::1

但我可以这样做:

 [1,2,3]@[1]

这很奇怪,因为我必须创建一个包含1的列表。有没有更好的方法呢?

2 个答案:

答案 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]有效,因为您要将列表附加到列表中。