SML:如何将元素附加到SML中的列表中?

SML:如何将元素附加到SML中的列表中?,sml,Sml,SML中是否有允许我附加到列表而无需创建新列表的运算符?比如说 我不能这样做: [1,2,3]::1 但我可以做到: [1,2,3]@[1] 这很奇怪,因为我必须创建一个包含1的列表。有更好的方法吗?您必须创建一个包含一个列表的列表。[1,2,3,1]的尾部的尾部是[1]。因此,如果内存中有[1,2,3,1],那么内存中的某个地方也有[1] 因此,即使存在类似于[1,2,3]@::1的运算符,也不会有什么不同,因为它仍然需要创建一个包含一个运算符的列表 PS:xs@[x]的真正问题不是列

SML中是否有允许我附加到列表而无需创建新列表的运算符?比如说

我不能这样做:

 [1,2,3]::1
但我可以做到:

 [1,2,3]@[1]

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

您必须创建一个包含一个列表的列表。
[1,2,3,1]
的尾部的尾部是
[1]
。因此,如果内存中有
[1,2,3,1]
,那么内存中的某个地方也有
[1]

因此,即使存在类似于
[1,2,3]@::1的运算符,也不会有什么不同,因为它仍然需要创建一个包含一个运算符的列表


PS:xs@[x]
的真正问题不是列表的创建,而是它的运行时是在O(n)中(而不是在O(1)中的
x::xs
)。这也是不可变单链表固有的一个问题,因此无法解决,但这就是为什么您通常应该避免在列表末尾追加那样的内容。

[1,2,3]::1
尝试将int list
[1,2,3]
追加到整数值
1
,这是不可能的,因为不能向其追加整数。
1::[1,2,3]
但是,它是完全有效的,因为列表
[1,2,3]
支持追加操作。
的评估规则需要
t1::t1 list
,其中t1是类型1的值,t1 list是类型1的列表,您要做的是
t1 list::t1

[1,2,3]@[1]
是有效的,因为您要将列表附加到列表中。

正如@sepp2k所说,将列表附加到列表的末尾是昂贵的。构建列表最慢的方法之一是在列表的末尾逐个添加元素,因为这样的方法最多只能是列表长度的二次方。出于这个原因,SML程序员有时编写函数,以向后的顺序创建列表(添加到前面而不是后面,即使在添加到后面似乎更自然的情况下),然后通过
rev
运行生成的列表(这是以一种巧妙的方式实现的,因此它是
O(n)
)获取所需列表。是否没有要附加的尾部指针?这也将是O(1)@Har附加到尾部指针(如果有,但没有)将改变原始列表。SML列表是不可变的,所以这是不可能的。@没错,没有尾部指针可附加到。1。您还将如何附加到列表中?2.它们不存储要附加到的尾部指针吗?3.x::xs到底做什么?创建新列表或附加到头指针?SML中的列表是作为链接结构还是数组实现的?@Har SML list是不可变的单链接列表。它们完全等同于
datatype list'a=Cons of'a*'a list | Nil
,其中
Cons
取代
Nil
取代
[]
。因此,非空列表有一个head值,另一个列表是tail。这两者都不能改变
x::xs
创建一个新列表,以
x
作为头值,以
xs
作为尾值。如果可以避免,我不会这样做。相反,我将使用
作为前缀。例如,如果您尝试多次追加,则在多次追加前加上前缀,然后反转列表更为合理。