由于:: : 'a -> 'a list -> 'a list
用于向列表的开始添加元素,有人可以告诉我是否有向结尾添加元素的功能列表?如果没有,我猜List.rev (element::(List.rev list))
是最简单的方法吗?
谢谢!
答案 0 :(得分:19)
没有标准功能的原因是在列表末尾添加的是反模式(又名“snoc list”或Schlemiel the Painter algorithm)。在列表末尾添加元素需要列表的完整副本。在列表前面添加元素需要分配一个单元格 - 新列表的尾部可以指向旧列表。
尽管如此,最简单的方法是
let append_item lst a = lst @ [a]
答案 1 :(得分:16)
list@[element]
应该有效。 @
加入列表。
答案 2 :(得分:12)
鉴于此操作是线性的,您不应在代码的“热门”部分使用它,因为性能很重要。在寒冷的部分,请list @ [element]
建议使用Adi
。在一个热门的部分,重写您的算法,以便您不需要这样做。
执行此操作的典型方法是在处理期间以 reverse 顺序累积结果,然后在返回结果之前反转整个累积列表。如果你有N个处理步骤(每个都在列表中添加一个元素),那么你可以分摊反向N个元素的线性成本,所以你保留一个线性算法而不是二次算法。
在某些情况下,另一种有效的技术是以反向顺序处理您的元素,这样累积的结果就会以正确的顺序处理,而不会有明确的反转步骤。