gpt4 book ai didi

scala - 从 Azavea Numeric 获取隐式 scala Numeric

转载 作者:行者123 更新时间:2023-12-02 00:08:06 27 4
gpt4 key购买 nike

我正在使用 Azavea Numeric Sc​​ala 库进行通用数学运算。但是,我无法将它们与 Scala Collections API 一起使用,因为它们需要 scala Numeric,并且看起来这两个 Numeric 是互斥的。除了要求所有类型都具有两个数值的上下文边界之外,是否有任何方法可以避免在 Azavea 数值的 Scala 集合上重新实现所有数学运算?

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

最佳答案

您可以使用 Régis Jean-Gilles 解决方案,这是一个很好的解决方案,并包装 Azavea 的 Numeric。您还可以尝试自己重新创建这些方法,但使用 Azavea 的 Numeric。除了 NumericRange 之外,大多数都应该非常容易实现。

您可能对 Spire 感兴趣不过,它继承了 Azavea 的数字库。它具有所有相同的功能,但也有一些新功能(更多操作、新数字类型、排序和选择等)。如果您使用 2.10(我们的大部分工作都是针对 2.10),那么使用 Spire 的 Numeric 几乎消除了通用方法的所有开销,并且通常运行速度与直接(非通用)实现一样快。

也就是说,我认为你的问题是一个很好的建议;我们确实应该在 Numeric 上添加一个 toScalaNumeric 方法。您计划使用哪种 Scala 收集方法? Spire 为数组添加了几个新方法,例如 qsum、qproduct、qnorm(p)、qsort、qselect(k) 等。

关于scala - 从 Azavea Numeric 获取隐式 scala Numeric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13120776/

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