gpt4 book ai didi

scala - Scala 2.9 中定义的 Numeric 和 Double 之间的隐式转换在哪里

转载 作者:行者123 更新时间:2023-12-02 11:07:01 34 4
gpt4 key购买 nike

我一直在研究一些编译良好的 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
}

我可以通过提供自己的函数来轻松解决这个问题:

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)
}
}

...创建新 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].

最佳答案

数字type class ,这意味着您不能以这种方式使用 Numeric[Double] 实例,而是在范围内有一个隐式 Numeric[Double] 来指定如何对 Double 执行数值运算(有关 Ordering 的相关讨论,请参阅 my answer here)。

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

class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }

或者:

class NumericRange[T](val lower: T, val upper: T)(implicit
ev: Numeric[T]
) { ... }

第一个中的“上下文绑定(bind)”只是第二个中隐式参数的语法糖。

关于scala - Scala 2.9 中定义的 Numeric 和 Double 之间的隐式转换在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670636/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com