Scala编译器无法识别视图绑定

use*_*242 2 scala

我试过这行代码

def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})
Run Code Online (Sandbox Code Playgroud)

但是在编译时,我收到了这个错误

error: value * is not a member of type parameter A
def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})
Run Code Online (Sandbox Code Playgroud)

当我查看数字特征的来源时,我看到了一个*操作定义.

我究竟做错了什么?

Mad*_*doc 7

实例Numeric不是数字本身,但它是一个提供算术运算的对象.例如,num类型的对象Numeric[Int]可以添加两个整数,如下所示:num.plus(3, 5)此操作的结果是整数7.

对于整数,这是非常微不足道的.但是,对于所有基本数字类型,都有一个可用的隐式实例Numeric.如果您定义自己的数字类型,则可以提供一个.

因此,您应该保留Aopen 的边界并添加一个类型的隐式参数Numeric[A],您可以使用该参数进行计算.像这样:

def **[A](l:List[A],m:List[A])(implicit num:Numeric[A])=l.zip(m).map({t=>num.times(t._1, t._2)})
Run Code Online (Sandbox Code Playgroud)

当然,num.times(a,b)看起来不如优雅a*b.在大多数情况下,人们可以忍受这种情况.但是,您可以将值包装在支持运算符a的类型的对象中Ops,如下所示:

// given are: num:Numeric[A], a:A and b:A
val a_ops = num.mkNumericOps(a)
val product = a_ops * b
Run Code Online (Sandbox Code Playgroud)

由于mkNumericOps声明了该方法implicit,您还可以导入它并隐式使用它:

// given are: num:Numeric[A], a:A and b:A
import num._
val product = a * b
Run Code Online (Sandbox Code Playgroud)