我爲了科學編程學習scala。我正在嘗試使用spire編寫一些簡單的通用代碼。我有下面的例子工作:獲取exp在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從spire的通用數字類型的工作示例?
UPDATE:
我可以使用,而不是數字觸發,這樣做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))
}
}
但是,它不與詮釋工作,只有浮點類型。此外,如果我使用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和開方我應該怎麼做,是有辦法使exp與Integral類型一起工作?
非常明確,並解決我的問題。我不知道你可以使用多個上下文邊界。 – jcrudy
顯然你也可以添加一個重載函數'def sqrtAndExp(x:Double):(Double,Double)',如果你想能夠用整數文字來調用它的話。 –