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

Scala编译器无法识别视图绑定,scala,Scala,我试过这行代码 def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2}) def**[A t._1*t._2}) 然而,在编译时,我得到了这个错误 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

我试过这行代码

def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})
def**[A t._1*t._2})
然而,在编译时,我得到了这个错误

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})
错误:值*不是类型参数a的成员
def**[A t.\U 1*t.\U 2})
当我查看数字特征的源代码时,我看到定义了一个
*
op


我做错了什么?

数值的实例本身不是一个数字,而是一个提供运算的对象。例如,类型为
Numeric[Int]
的对象
num
可以添加两个整数:
num.plus(3,5)
此运算的结果是整数7

对于整数来说,这是非常简单的。但是,对于所有基本的数值类型,都有一个可用的
Numeric
隐式实例。如果您定义自己的数值类型,则可以提供一个

因此,您应该将
A
的边界保持为打开状态,并添加一个类型为
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)})
当然,
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
由于方法
mkNumericOps
声明为
implicit
,因此您也可以导入它并隐式使用它:

// given are: num:Numeric[A], a:A and b:A
import num._
val product = a * b

您还可以使用解决此问题的方法。使用中的
context
方法,您可以编写:

def **[A : Numeric](l:List[A],m:List[A]) =
   l zip m map { t => context[A]().times(t._1, t._2) }


在**函数的上下文中,我将把import num.u语句放在哪里?您需要在等号后打开一个块。我没有测试这个,但我假设它必须是这样的:
def**[a](l:List[a],m:List[a])(隐式num:Numeric[a])={import num.u;l.zip(m).map({t=>t.\u 1*t.\u 2}
——不过我会尽量不使用它;我不确定隐式包装器Ops对象的创建是否会影响性能,或者编译器是否会对其进行优化。如果启用了转义分析,我希望应该对其进行优化,但没有保证。
def **[A : Numeric](l:List[A],m:List[A]) = {
   val num = context[A]()
   import num._
   l zip m map { t => t._1 * t._2 }
}