Scala:如何访问“Numeric”类型的算术运算?
Scala: how do I access a `Numeric` type's arithmetic operations?
class Foo[T](t: T)(implicit int: Numeric[T]) {
val negated = -t
val doubled = t + t
val squared = t * t
// ...
}
我在这里的所有三行上都有红色波浪线。给出了什么?
您需要为这些函数的隐式转换添加导入:
class Foo[T](t: T)(implicit num: Numeric[T]){
import num._
val negated = -t
val doubled = t + t
val squared = t * t
}
因为实际上它们是这样定义的(scala source code)
class Ops(lhs: T) {
def +(rhs: T) = plus(lhs, rhs)
def *(rhs: T) = times(lhs, rhs)
// etc
}
您也可以放弃隐式转换并改为这样做:
class Foo[T](t: T)(implicit num: Numeric[T]){
val negated = num.negate(t)
val doubled = num.plus(t, t)
val squared = num.times(t, t)
}
您有一些 T
的 Numeric[T]
实例,这就是所有好东西所在的地方。所以你只需要访问你想要的方法(例如 plus
):
class Foo[T](t: T)(implicit int: Numeric[T]) {
val sum = int.plus(t, t)
}
如果您使用上下文绑定("T : Numeric" 语法糖),那么:
class Foo[T : Numeric](t: T) {
val sum = implicitly[Numeric[T]].plus(t, t)
}
如果您想使用 +
等快捷运算符,只需导入隐式实例的成员即可:
class Foo[T](t: T)(implicit int: Numeric[T]) {
import int._
val sum = t + t
}
class Foo[T](t: T)(implicit int: Numeric[T]) {
val negated = -t
val doubled = t + t
val squared = t * t
// ...
}
我在这里的所有三行上都有红色波浪线。给出了什么?
您需要为这些函数的隐式转换添加导入:
class Foo[T](t: T)(implicit num: Numeric[T]){
import num._
val negated = -t
val doubled = t + t
val squared = t * t
}
因为实际上它们是这样定义的(scala source code)
class Ops(lhs: T) {
def +(rhs: T) = plus(lhs, rhs)
def *(rhs: T) = times(lhs, rhs)
// etc
}
您也可以放弃隐式转换并改为这样做:
class Foo[T](t: T)(implicit num: Numeric[T]){
val negated = num.negate(t)
val doubled = num.plus(t, t)
val squared = num.times(t, t)
}
您有一些 T
的 Numeric[T]
实例,这就是所有好东西所在的地方。所以你只需要访问你想要的方法(例如 plus
):
class Foo[T](t: T)(implicit int: Numeric[T]) {
val sum = int.plus(t, t)
}
如果您使用上下文绑定("T : Numeric" 语法糖),那么:
class Foo[T : Numeric](t: T) {
val sum = implicitly[Numeric[T]].plus(t, t)
}
如果您想使用 +
等快捷运算符,只需导入隐式实例的成员即可:
class Foo[T](t: T)(implicit int: Numeric[T]) {
import int._
val sum = t + t
}