Scala:类型不匹配错误

Scala: type mismatch error

我是 scala 的新手,我正在按照 k-means

的教程使用 k-means 算法进行练习

我对本教程的这一部分感到困惑:

var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap()  

这会导致类型不匹配错误,因为函数 average 需要一个 Seq,而我们给它一个 Iterable。我怎样才能解决这个问题?是什么导致了这个错误?

SeqIterable 的子类型,但反之则不然,因此无法在类型系统中转换这些类型。

可以通过写 average(ps.toSeq) 进行显式转换。此转换将迭代 Iterable 并将项目收集到 Seq.

我们可以在为 average 函数提供的解决方案中轻松地将 Seq 替换为 Iterable

def average(ps: Iterable[Vector]) : Vector = {
  val numVectors = ps.size
  var out = new Vector(ps.head.elements)
  ps foreach ( out += _)
  out / numVectors
}

或者甚至是常数 space:

def average(ps: Iterable[Vector]): Vector = {
  val numVectors = ps.size

  val vSize = ps.head.elements.length

  def element(index: Int): Double = ps.map(_(index)).sum / numVectors

  new Vector(0 until vSize map element toArray)
}