Scala 编译器无法识别 View 绑定(bind)

标签 scala

我试过这行代码

def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>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})

当我查看 Numeric 特征的源代码时,我看到定义了一个 * 操作。

我做错了什么?

最佳答案

Numeric 的实例本身并不是一个数字,而是一个提供算术运算的对象。例如,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方法被声明为隐式,您也可以导入它并隐式使用它:

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

关于Scala 编译器无法识别 View 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4436936/

相关文章:

scala - 在哪里放置定期执行的更新参与者内部状态的计算?

scala - GADT Type as Shapeless Coproduct——如何用任意数量的代数构建解释器

scala - 任何实用的编码dojo/kata想法?

scala - 选择 DataFrame 中数组的最后一个元素

将迭代的每个元素与另一个元素的每个元素组合的Scala方法?

scala - 调用 super 构造函数

java - 斯卡拉 'nothing to override' 错误

Scala - 在本地范围内对大量文件执行 XML.loadFile 时堆使用率高

scala - akka 如何启动主任务并阻止它完成?

scala - 从多个不同类型的 Future 组成 Scala Future 时遇到困难