Сравнение с числовыми типами Scala? - PullRequest
7 голосов
/ 17 ноября 2011

Как создать класс, который выполняет математические и сравнения для любого числового типа в 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

Хммм ... мы можем сделать математику с числовыми типами, но мы не можем их сравнить?

Итак, давайте также скажем, что T это Ordered[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 ]

14 голосов
/ 17 ноября 2011
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
4 голосов
/ 17 ноября 2011

Вы должны импортировать mkNumericOps и / или mkOrderingOps:

val num = implicitly[Numeric[T]]

или

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

, затем:

import num.{mkNumericOps,mkOrderingOps}

Теперь вы можетесравнить и рассчитать с ними.Возможно, это поможет вам в первой части вашего вопроса.

Кстати: Упорядоченный и Числовой работает так:

class Ops[T: Ordered: Numeric]
...