为什么Scala Immutable Vector不提供insertAt方法?

时间:2015-10-20 10:04:01

标签: scala

Scala不可变向量是使用Relaxed Radix Balanced Trees实现的,它提供log(n)复杂性的单个元素追加,如HAMT,还有log(n)insertAt和连接。

为什么API不公开insertAt?

2 个答案:

答案 0 :(得分:1)

您可以创建在不可变向量上运行的自定义insertAt方法(忽略性能问题)。只是粗略的方法草图

def insertAt[T]( v: Vector[T], elem: T, pos: Int) : Vector[T] = {
  val n = v.size
  val front = v.take(pos)
  val end = v.takeRight(n-pos)
  front ++ Vector(elem) ++ end
}

呼叫:

val x = Vector(1,2,3,5)
println( insertAt( x, 7, 0) )
println( insertAt( x, 7, 1) )
println( insertAt( x, 7, 2) )

输出:

Vector(7, 1, 2, 3, 5)
Vector(1, 7, 2, 3, 5)
Vector(1, 2, 7, 3, 5)

在此草图中未正确处理

  • 类型。
  • 索引检查。

使用 pimp-my-library 模式将其添加到Vector类。

编辑:insertAt

的更新版本
def insertAt[T]( v: Vector[T], elem: T, pos: Int) : Vector[T] =
  v.take(pos) ++ Vector(elem) ++ v.drop(pos)

答案 1 :(得分:0)

拥有高效insertAt通常不是我期望从一般Vector开始的操作,不可变或不可变。这更像是(可变的)链接列表的范围。

将高效insertAt放入Vector的公共API会严重限制该API的实施选择。虽然目前只有一个Scala标准库API的实现(我个人觉得相当不幸,一点竞争不会受到影响,请参阅C ++,C,Java,Ruby,Python,了解多个实现如何实现培养友好的coopetition)环境,没有办法知道这将永远是这样的。因此,您应该非常小心保证添加到Scala标准库的公共API,否则您可能会以不正当的方式限制当前单个实现的未来版本以及潜在的替代实现。

再次,请参阅Ruby以获取示例,其中公开API中一个实现的实现细节已导致其他实现者的严重痛苦。