【发布时间】:2012-10-29 11:30:42
【问题描述】:
我正在使用 Azavea Numeric Scala 库进行通用数学运算。但是,我不能将它们与 Scala Collections API 一起使用,因为它们需要一个 scala Numeric 并且看起来这两个 Numeric 是互斥的。除了要求所有类型都具有两个 Numeric 的上下文边界之外,有什么方法可以避免在 Scala Collections for Azavea Numeric 上重新实现所有数学运算?
import Predef.{any2stringadd => _, _}
class Numeric {
def addOne[T: com.azavea.math.Numeric](x: T) {
import com.azavea.math.EasyImplicits._
val y = x + 1 // Compiles
val seq = Seq(x)
val z = seq.sum // Could not find implicit value for parameter num: Numeric[T]
}
}
Azavea Numeric 定义为
trait Numeric[@scala.specialized A] extends java.lang.Object with
com.azavea.math.ConvertableFrom[A] with com.azavea.math.ConvertableTo[A] with scala.ScalaObject {
def abs(a:A):A
...remaining methods redacted...
}
object Numeric {
implicit object IntIsNumeric extends IntIsNumeric
implicit object LongIsNumeric extends LongIsNumeric
implicit object FloatIsNumeric extends FloatIsNumeric
implicit object DoubleIsNumeric extends DoubleIsNumeric
implicit object BigIntIsNumeric extends BigIntIsNumeric
implicit object BigDecimalIsNumeric extends BigDecimalIsNumeric
def numeric[@specialized(Int, Long, Float, Double) A:Numeric]:Numeric[A] = implicitly[Numeric[A]]
}
【问题讨论】:
-
“除了要求所有类型都具有两个数字的上下文边界之外?”这种方法有什么问题?
-
在我们的特定场景中,有问题的代码在其之上具有重要的层次结构,因此要避免使用 Scala 数字上下文边界污染大量类。此外,命名冲突意味着外部 API 变得更加混乱,完全限定的名称,从根本上说,Azavea Numeric 应该是 Scala Numeric 的扩展,而不是替代。
-
这没有任何意义......
-
抱歉,由于某种原因,它只显示了您评论的前几个字
-
我不知道
com.azavea.math.Numeric是如何定义的,但是如果它提供了与Scala的Numeric相同的功能,那么应该有一种方法可以将一个转换为另一个。你应该发布com.azavea.math.Numerics 的定义。