Scala:类型不匹配错误
Scala: type mismatch error
我是 scala 的新手,我正在按照 k-means
的教程使用 k-means 算法进行练习
我对本教程的这一部分感到困惑:
var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap()
这会导致类型不匹配错误,因为函数 average
需要一个 Seq
,而我们给它一个 Iterable
。我怎样才能解决这个问题?是什么导致了这个错误?
嗯 Seq
是 Iterable
的子类型,但反之则不然,因此无法在类型系统中转换这些类型。
可以通过写 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)
}
我是 scala 的新手,我正在按照 k-means
的教程使用 k-means 算法进行练习我对本教程的这一部分感到困惑:
var newCentroids = pointsGroup.mapValues(ps => average(ps)).collectAsMap()
这会导致类型不匹配错误,因为函数 average
需要一个 Seq
,而我们给它一个 Iterable
。我怎样才能解决这个问题?是什么导致了这个错误?
嗯 Seq
是 Iterable
的子类型,但反之则不然,因此无法在类型系统中转换这些类型。
可以通过写 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)
}