与Scala'的比较;什么是数字类型?
如何创建一个类来对Scala中的任何数值类型进行数学比较 一个明显的方法是:与Scala'的比较;什么是数字类型?,scala,math,numeric,Scala,Math,Numeric,如何创建一个类来对Scala中的任何数值类型进行数学比较 一个明显的方法是: import math.Numeric.Implicits._ class Ops[T : Numeric] { def add(a: T, b: T) = a + b def gt(a: T, b: T) = a > b } 这是我应得的 Ops.scala:7: value > is not a member of type parameter T 嗯。。。我们可以用数字类型做数学
import math.Numeric.Implicits._
class Ops[T : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
这是我应得的
Ops.scala:7: value > is not a member of type parameter T
嗯。。。我们可以用数字类型做数学运算,但我们不能比较它们
也就是说,T
是有序的[T]
class Ops[T <: Ordered[T] : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
我得到
Ops.scala:13: type arguments [Int] do not conform to class Ops's type parameter bounds [T <: Ordered[T]]
Ops.scala:13:type参数[Int]不符合类Ops的类型参数界限[T您必须导入mkNumericOps
和/或mkOrderingOps
:
val num = implicitly[Numeric[T]]
或
然后:
现在您可以与它们进行比较和计算。
也许这有助于你回答问题的第一部分
顺便说一下:有序和数字的工作原理如下:
class Ops[T: Ordered: Numeric]
这将是T:Ordering:Numeric
(或者T@Tim我自己也遇到了你的问题,我认为应该有一种方法来避免调用gt
那么笨拙。所以我看了一下API,发现了一个神秘的mkOrderingOps
…总是仔细看一下API!应该说,你不需要T
来排序就可以了。所以它是有效的。)fices应该有T:Numeric
。正如迪迪尔德指出的,有序的将被用作这里的视图绑定(T是的,我也尝试过使用gt
,但甚至可以让它工作。正如我在下面所说的,我只是在加快速度,对于导入num的原因仍然有点困惑。{mkNumericOps,mkOrderingOps}
工作。这是如何在其他变量上导入中缀运算符的?@Tim:mkNumericOps
是从类型N
到类型Op
的隐式转换(其中N
是一些Numeric
类型)。此类Op
包含中缀数字运算符。换句话说,代码中的a+b
将减为mkNumericOps(a)。+(b)
.Nice,没有意识到与本地导入相比的那种全局导入numeric.mkXXXOps
。将使用它。numeric
扩展排序
,因此请求排序
上下文边界是多余的!t:numeric
就足够了。@Sciss很好的观点!是我说的应该有一个上下文边界吗仔细看看API?!还没有仔细看清楚Numeric我猜Numeric必须以某种方式排序(这就是为什么我在下面的评论中感到如此困惑)。我也不知道排序的含义。(刚刚开始。)
class Ops[T](implicit num: Numeric[T])
import num.{mkNumericOps,mkOrderingOps}
class Ops[T: Ordered: Numeric]
scala> import Ordering.Implicits._
import Ordering.Implicits._
scala> import Numeric.Implicits._
import Numeric.Implicits._
scala> class Ops[T : Numeric] {
| def add(a: T, b: T) = a + b
| def gt(a: T, b: T) = a > b
| }
defined class Ops
scala> new Ops[Int].gt(12, 34)
res302: Boolean = false