Scala:类型不匹配错误

时间:2015-04-16 06:38:27

标签: scala apache-spark

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

使用k-means算法练习它

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

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

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

2 个答案:

答案 0 :(得分:4)

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

通过撰写average(ps.toSeq)可以获得明确的转化。此转化将迭代Iterable并将项目收集到Seq

答案 1 :(得分:2)

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

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

甚至在恒定的空间中:

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)
}