У меня есть следующая проблема: у Меня есть функция, которая берет Список [Дважды] в качестве параметра, выполняет некоторые арифметические операции на элементах списка и, чем возврат результат. Я хотел бы, чтобы функция также приняла Список [Интервал]. Вот пример:
def f(l: List[Double]) = {
var s = 0.0
for (i <- l)
s += i
s
}
val l1 = List(1.0, 2.0, 3.0)
val l2 = List(1, 2, 3)
println(f(l1))
println(f(l2))
Конечно, вторые сбои println с тех пор f требуют Списка [Дважды] и не Списка [Интервал].
Также отметьте не scala формулировка стиля суммы в функции f для доказательства потребности использовать 0 (или другие константы) в самой функции (если я суммирую Международные значения, я имею к init s к 0 не 0.0.
Который является лучшим способом (меньше кода) для получения функциональной работы и над Дважды и над Интервал?
(Я видел что-то приблизительно 2,8 Числовых черты, я не так уверен, как использовать их...),
Спасибо все для справки.
В scala 2.8 и использовании числового комбинирования для неявного преобразования ваш пример может быть записан как:
import Numeric._
def f[T](l: List[T])(implicit n: Numeric[T]):T = {
var s = n.zero
for (i <- l)
s = n.plus(s, i)
s
}
val l1 = List(1.0, 2.0, 3.0)
val l2 = List(1, 2, 3)
println(f(l1))
println(f(l2))
//or
def f2[T](l: List[T])(implicit n: Numeric[T]):T = {
import n._
var s = zero
for (i <- l)
s += i
s
}
println(f2(l1))
println(f2(l2))
Теперь еще один пример суммирования в более масштабном стиле:
def sum[T](l:List[T])(implicit n: Numeric[T]):T = {
import n._
l.foldLeft(zero)(_ + _)
}
println(sum(l1))
println(sum(l2))
//or since 2.8 Seq include already a sum function
def sum[T](l:List[T])(implicit n: Numeric[T]):T = l.sum
println(sum(l1))
println(sum(l2))
В этом ответе используется числовой признак.
import Numeric._
def f[A](l: List[A])(implicit numeric: Numeric[A]) =
l reduceLeft ((l,r) => numeric.plus(l, r))
Или используя контекстные границы:
def f[A : Numeric](l: List[A]) =
l.reduceLeft((l,r) => implicitly[Numeric[A]].plus(l, r))