Scala将具有复杂类型的方法添加到最终类中

时间:2017-06-11 22:32:39

标签: scala vector types

我正在尝试向Vector类添加点积方法。我试过像:

class MatrixVector[T <: Numeric[T]] extends Vector[T]{

  def dot(vector: MatrixVector[T]): T = {
    this.zip(vector).map(t =>  t._1 + t._2).sum
  }
}

但是,这不起作用,因为Vector是最终的,无法扩展。扩展最终类的声称解决方案是创建一个隐式类。但是,这不起作用,因为我希望向量适用于所有Numeric类型,并且我不能创建一个传递类型约束的隐式类。 E.g:

object {
  implicit class dotProd[T <: Numeric[T]](v1: Vector[T]) {
    def dot(v2: Vector[T]): T = {
      v1.zip(v2).map(t =>  t._1 + t._2).sum
    }
  }
}

这会导致类型错误,我甚至不确定是否有一个带有隐式类的类型约束。

如何使用具有复杂类型的方法扩展最终类?

1 个答案:

答案 0 :(得分:3)

scala> implicit class dotProd[T](v1: Vector[T])(implicit ev:Numeric[T]) { 
  def dot(v2: Vector[T]): T = v1.zip(v2).map(t => ev.times(t._1, t._2) ).sum // see (*) at the bottom
}
defined class dotProd

scala> Vector(1,2,3).dot(Vector(10,10,10))
res0: Int = 60

数字不是由数字类型扩展的类。 Numeric类型类。 Numeric的一个示例实例是IntIsIntegral,此类不表示Int,而是可以对Ints执行的数值运算。

(*)顺便说一下,你dot product的原始定义是添加了矢量的元素,这不是正确的点积。