class Foo[T](t: T)(implicit int: Numeric[T]) {
val negated = -t
val doubled = t + t
val squared = t * t
// ...
}
我在这三条线上都有红色波浪形。是什么给了什么?
答案 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)
}
等快捷操作符,只需导入隐式实例的成员:
+