我正在尝试向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
}
}
}
这会导致类型错误,我甚至不确定是否有一个带有隐式类的类型约束。
如何使用具有复杂类型的方法扩展最终类?
答案 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的原始定义是添加了矢量的元素,这不是正确的点积。