Добавление общего списка Scala

У меня есть функция:

 def listSum[T](xs :List[T])(implicit  abc : Numeric[T]): T = {
    xs.sum
  }

  val IntList: List[Int] = List (1, 2, 3, 4)
  val DList: List[Double] = List (1.0, 2.0, 3, 4)

приведенный выше пример кода работает нормально, но когда я перехожу к функции ниже, он перестает работать с ошибкой

не удалось найти неявное значение для параметра abc: Numeric[AnyVal]

Поскольку AnyVal является базовым типом, я могу добавить, не так ли?

где определены все имплициты?

 def listSum(xs :List[AnyVal])(implicit  abc : Numeric[AnyVal]) = {
    xs.sum
  }

 val AList: List[AnyVal] = List (1, 2, 3, 4)

Тоже не работает, думаю по той же причине.

  def listSum[T](xs :List[T])(implicit  abc : Numeric[T]): T = {
    xs.sum
  }

  val BList : List[Boolean] = List(true, false)
  println(listSum(BList))

person Mike    schedule 19.12.2016    source источник
comment
Вы не можете суммировать любые значения, так как не определено, как это сделать. Однако вы можете суммировать числовые значения. Пример def listSum[T: Numeric](xs: List[T]): T = xs.sum   -  person Tyth    schedule 19.12.2016


Ответы (2)


В вашем вопросе есть несколько неверных предположений:

  1. AnyVal — это супертип всех примитивных типов, а классы значений. Наряду с AnyRef это одна из двух ветвей типа, уходящая корнями в тип Any, который является истинным супертипом всех.
  2. Тип Numeric не ковариант, что означает, что существование Numeric[Int] не подразумевает существование Numeric[AnyVal], что очень логично, если вы думаете на секунду. Целые числа — это подобласть вещественных чисел, но знание того, как умножать целые числа, не означает, что вы знаете, как умножать действительные числа.
  3. Полиморфизм подтипов не имеет прямого отношения к ограниченный параметрический полиморфизм. Первый в основном обрабатывается во время выполнения, а второй - во время компиляции. Они взаимодействуют очень специфическими способами в scala.
  4. Не существует единого места, где определяются неявные значения. Есть несколько мест для каждого конкретного типа и места в коде. .
person Odomontois    schedule 19.12.2016

Все неявные определения для Numeric[T] определены в scala/math/Numeric.scala.

(при условии, что Скала 2.10.4)

Для Numeric[AnyVal] нет неявного определения, поэтому вы получаете ошибку для своего первого примера (это имеет смысл, потому что нельзя определить числовые операции, не зная ничего о базовом типе)

Также нет неявного определения для Numeric[Boolean], поэтому вы получаете ошибку для своего второго примера (это также имеет смысл, потому что нельзя определить операцию plus, minus, times, negate и т. д. над логическими значениями, не предполагая ничего о конкретном домен проекта).

вы можете определить неявный Numeric[Boolean] самостоятельно, если это имеет смысл для вашего проекта, но было бы лучше избегать использования неявного Numeric[T] для логического типа.

person DeadNight    schedule 19.12.2016