与Scala的数字类型比较?

时间:2011-11-17 15:03:09

标签: 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

嗯......我们可以用数字类型做数学,但我们无法比较它们?

所以我们也要说TOrdered[T] ...

class Ops[T <: Ordered[T] : Numeric] {
    def add(a: T, b: T) = a + b
    def gt(a: T, b: T) = a > b
}

编译。但是试着用呢?

new Ops[Int].gt(1, 2)

我得到......

Ops.scala:13: type arguments [Int] do not conform to class Ops's type parameter bounds [T <: Ordered[T]]

那么如何操作某些有序和数字的类型?

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:4)

您必须导入mkNumericOps和/或mkOrderingOps

val num = implicitly[Numeric[T]]

class Ops[T](implicit num: Numeric[T]) 

然后:

import num.{mkNumericOps,mkOrderingOps}

现在您可以与它们进行比较和计算。 也许这可以帮助你完成问题的第一部分。

顺便说一下:Ordered和Numeric就是这样的:

class Ops[T: Ordered: Numeric]