我为了科学编程而学习scala。我正在尝试使用 spire 编写一些简单的通用代码。我有以下示例工作:
import spire.algebra._
import spire.math._
import spire.implicits._
object TestSqrt {
def testSqrt[T: Numeric](x: T) = {
sqrt(x)
}
def main(args: Array[String]){
val x_d: Double = 4.0
println(testSqrt(x_d))
val x_i: Int = 4
println(testSqrt(x_i))
}
}
正如预期的那样,这将打印出 2.0 和 2。问题是我不能用 exp 函数得到同样的东西。以下代码无法编译:
import spire.algebra._
import spire.math._
import spire.implicits._
object TestExp {
def testExp[T: Numeric](x: T) = {
exp(x)
}
def main(args: Array[String]){
val x_d: Double = 4.0
println(testExp(x_d))
val x_i: Int = 4
println(testExp(x_i))
}
}
编译器说:
... could not find implicit value for parameter t: spire.algebra.Trig[T]
[error] exp(x)
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
我做错了什么,还不支持 exp,还是这是一个错误?任何人都可以提供一个使用 exp 和来自 spire 的通用数字类型的工作示例吗?
更新:
我可以通过使用 Trig 而不是 Numeric 来使 exp 工作,如下所示:
import spire.algebra._
import spire.math._
import spire.implicits._
object TestExp {
def testExp[T: Trig](x: T) = {
exp(x)
}
def main(args: Array[String]){
val x_d: Double = 1.0
println(testExp(x_d))
val x_f: Float = 1.0f
println(testExp(x_f))
// val x_i: Int = 4
// println(testExp(x_i))
}
}
但是,它不适用于 Int,仅适用于浮点类型。此外,如果我使用 Trig,则无法使用 sqrt。以下代码无法编译:
}
import spire.algebra._
import spire.math._
import spire.implicits._
object TestSqrt {
def testSqrt[T: Trig](x: T) = {
sqrt(x)
}
def main(args: Array[String]){
val x_d: Double = 4.0
println(testSqrt(x_d))
val x_i: Int = 4
println(testSqrt(x_i))
}
}
并给出错误:
... could not find implicit value for evidence parameter of type spire.algebra.Trig[Int]
[error] println(testSqrt(x_i))
[error] ^
[error] two errors found
[error] (compile:compile) Compilation failed
如果我想要 exp 和 sqrt,我应该怎么做,有没有办法让 exp 与 Integral 类型一起工作?