Scala 2.9中定义的数字和双精度之间的隐式转换在哪里
我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。把它归结为一个非常简单的例子,这段代码没有编译,原因似乎是我没有导入Double和Numeric[Double]之间的隐式转换:Scala 2.9中定义的数字和双精度之间的隐式转换在哪里,scala,numeric,implicit-conversion,Scala,Numeric,Implicit Conversion,我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。把它归结为一个非常简单的例子,这段代码没有编译,原因似乎是我没有导入Double和Numeric[Double]之间的隐式转换: import scala.math.Numeric import scala.math.Numeric._ import scala.math.Numeric.Implicits._ import Ordering.Implicits._ object Impl
import scala.math.Numeric
import scala.math.Numeric._
import scala.math.Numeric.Implicits._
import Ordering.Implicits._
object ImplicitNumericConversions {
val v: Numeric[Double] = 3.0
}
我可以通过提供自己的功能轻松解决此问题:
import scala.math.Numeric
object ImplicitNumericConversions {
def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num
val v: Numeric[Double] = convertDoubleToNumeric(3.0)
}
如果我使转换函数隐式,那么我得到了我想要的:
import scala.math.Numeric
object ImplicitNumericConversions {
implicit def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num
val v: Numeric[Double] = 3.0
}
。。。但是为什么scala.math.Numeric的导入不为我做这个呢
我正在处理的实际问题如下所示:
class NumericRange[T <% Numeric[T]](val lower: T, val upper: T) { ... }
object NumericRange {
def apply[T](lower: T, upper: T)(implicit num: Numeric[T]) = {
import num._
new NumericRange[T](lower, upper)
}
}
Numeric
是一个,这意味着您不会以这种方式处理Numeric[Double]
的实例,而是在指定如何对Double
执行数字操作的范围内有一个隐式Numeric[Double]
(有关排序的相关讨论,请参阅)
因此,您要查找的是隐式的Numeric[T]
,而不是T=>Numeric[T]
。幸运的是,你可以写:
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }
或:
第一个中的“上下文绑定”只是第二个中隐式参数的语法糖。解决了NumericRange的问题。我尝试将同样的技术应用到OrderedRange实现中。使用(隐式ev:Ordering[T])也以同样的方式工作。我无法(隐式ev:Ordered[t])查看比较运算符,因此在这个问题上还有另一个难题需要解决,但我将把它留给另一个问题。惊人的回答-谢谢你。
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }
class NumericRange[T](val lower: T, val upper: T)(implicit
ev: Numeric[T]
) { ... }