Scala:我如何访问`Numeric`类型的算术运算?

时间:2018-01-18 23:16:46

标签: scala numeric implicit

class Foo[T](t: T)(implicit int: Numeric[T]) {
  val negated = -t
  val doubled = t + t
  val squared = t * t
  // ...
}

我在这三条线上都有红色波浪形。是什么给了什么?

2 个答案:

答案 0 :(得分:4)

您需要为这些函数的隐式转换添加导入:

(defn my-range [n]
  (if (< n 0)
    []       ; empty list
    (conj
     (my-range (dec n)) ; recursive call to build smaller list
     n)))     

因为实际上它们是这样定义的(scala source code

class Foo[T](t: T)(implicit num: Numeric[T]){
  import num._
  val negated = -t
  val doubled = t + t
  val squared = t * t
}

您也可以放弃隐式转换,而是执行此操作:

class Ops(lhs: T) {
  def +(rhs: T) = plus(lhs, rhs)
  def *(rhs: T) = times(lhs, rhs)
  // etc
}

答案 1 :(得分:4)

对于某些install,您有一个Numeric[T]的实例,这就是所有好东西的所在。因此,您只需访问所需的方法(例如T):

plus

如果你使用上下文绑定(&#34; T:数字&#34;语法糖),那么:

class Foo[T](t: T)(implicit int: Numeric[T]) {

  val sum = int.plus(t, t)

}

如果要使用class Foo[T : Numeric](t: T) { val sum = implicitly[Numeric[T]].plus(t, t) } 等快捷操作符,只需导入隐式实例的成员:

+