Я изучаю 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 с общим числовым типом из spire?
UPDATE:
я могу сделать ехр работу с помощью Триг вместо ввода цифр, например:
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
Что я должен делать, если я хочу, как ехр и SQRT, и есть способ сделать работать с интегральными типами?
Очень ясно и решает мою проблему. Я понятия не имел, что вы можете использовать несколько границ контекста. – jcrudy
Очевидно, вы также можете добавить перегруженную функцию 'def sqrtAndExp (x: Double): (Double, Double)', если вы хотите иметь возможность называть ее целыми литералами. –