ric*_*chj 3 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 ImplicitNumericConversions {
val v: Numeric[Double] = 3.0
}
Run Code Online (Sandbox Code Playgroud)
我可以通过提供自己的功能来轻松解决这个问题:
import scala.math.Numeric
object ImplicitNumericConversions {
def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num
val v: Numeric[Double] = convertDoubleToNumeric(3.0)
}
Run Code Online (Sandbox Code Playgroud)
如果我隐式转换函数,那么我得到我正在寻找的东西:
import scala.math.Numeric
object ImplicitNumericConversions {
implicit def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num
val v: Numeric[Double] = 3.0
}
Run Code Online (Sandbox Code Playgroud)
...但为什么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)
}
}
Run Code Online (Sandbox Code Playgroud)
...创建新NumericRange的行不会使用这些错误进行编译:
Multiple markers at this line
- No implicit view available from T => scala.math.Numeric[T].
- not enough arguments for constructor NumericRange: (implicit evidence$1: T => scala.math.Numeric[T])org.reductio.rtree.NumericRange[T]. Unspecified value parameter
evidence$1.
- not enough arguments for constructor NumericRange: (implicit evidence$1: T => scala.math.Numeric[T])org.reductio.rtree.NumericRange[T]. Unspecified value parameter
evidence$1.
- No implicit view available from T => scala.math.Numeric[T].
Run Code Online (Sandbox Code Playgroud)
Numeric是一个类型类,这意味着你不能Numeric[Double]以这种方式处理实例,而是你有一个隐含Numeric[Double]的范围指定如何执行数字操作Double(请参阅我在这里的答案进行相关讨论Ordering).
所以你正在寻找一个隐含的Numeric[T],而不是一个T => Numeric[T].幸运的是,Double中有一个范围,所以你可以写:
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }
Run Code Online (Sandbox Code Playgroud)
要么:
class NumericRange[T](val lower: T, val upper: T)(implicit
ev: Numeric[T]
) { ... }
Run Code Online (Sandbox Code Playgroud)
第一个中的"上下文绑定"只是第二个中隐式参数的语法糖.
| 归档时间: |
|
| 查看次数: |
1559 次 |
| 最近记录: |