首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala2.9中,Numeric和Double之间的隐式转换定义在哪里

在Scala2.9中,Numeric和Double之间的隐式转换定义在哪里
EN

Stack Overflow用户
提问于 2012-12-02 23:20:47
回答 1查看 1.6K关注 0票数 3

我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。简而言之,这段代码不能编译,原因似乎是我没有导入Double和NumericDouble之间的隐式转换

代码语言:javascript
复制
import scala.math.Numeric
import scala.math.Numeric._
import scala.math.Numeric.Implicits._
import Ordering.Implicits._

object ImplicitNumericConversions {
  val v: Numeric[Double] = 3.0
}

通过提供自己的函数,我可以很容易地解决这个问题:

代码语言:javascript
复制
import scala.math.Numeric

object ImplicitNumericConversions {
  def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num

  val v: Numeric[Double] = convertDoubleToNumeric(3.0)
}

如果我将转换函数设为隐式,那么我就会得到我想要的结果:

代码语言:javascript
复制
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导入不能为我做这件事呢?

我正在解决的实际问题如下所示:

代码语言:javascript
复制
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)
  }
}

..。在编译创建新NumericRange的代码行时,不会显示以下错误:

代码语言:javascript
复制
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].
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-02 23:55:17

Numeric是一个type class,这意味着您不能以这种方式使用Numeric[Double]的实例,而是在作用域中有一个隐式的Numeric[Double],它指定如何在Double上执行数值操作(有关Ordering的相关讨论,请参阅my answer here )。

因此,您要查找的是隐式Numeric[T],而不是T => Numeric[T]。幸运的是,这里有one of those in scope for Double,所以你可以这样写:

代码语言:javascript
复制
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }

或者:

代码语言:javascript
复制
class NumericRange[T](val lower: T, val upper: T)(implicit
  ev: Numeric[T]
) { ... }

第一个中的“上下文界限”只是第二个中隐含参数的句法糖。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13670636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档