Почему я не могу уменьшить (+) на последовательность целых чисел в Scala?

Я хочу получить сумму seq из Integerв Скале.

На мой взгляд, я хочу сложить плюс над целыми числами, как это:

val seqOfIntegers:Seq[Int] = Seq(1, 2, 3, 4, 5)
val sumOfIntegers = seqOfIntegers.reduce(+)

Это не верно

Вместо этого я должен сделать:

val sumOfIntegers = seqOfIntegers.reduce(plus)
...
def plus(a:Integer, b:Integer): Integer = { a + b}

(Я уверен, что вы могли бы это засвидетельствовать - но я хочу сказать, что оригинальный символ плюса не работает как функция, и сообщения об ошибках не дают понять, почему.)

У меня вопрос: почему я не могу уменьшить (+) на последовательность целых чисел в Scala?

1 ответ

Решение

Это потому что + это не функция (то есть объект типа Function2[Int, Int, Int], который так же, как (Int, Int) => Int). Вместо этого это метод на Int, который занимает другое Int и возвращает Int, То есть то, что вы хотите передать reduce на самом деле (a: Int, b: Int) => a.+(b), которые могут быть засахарены в (a: Int, b: Int) => a + b а потом _ + _,

То есть,

seq.reduce(_ + _)

будет работать как ожидалось.


Изготовление .reduce(+) Работа

Если вы хотите пройти + в качестве аргумента, вы должны определить значение + это расширяет (Int, Int) => Int, Например:

object + extends ((Int, Int) => Int) { def apply(a: Int, b: Int): Int = a + b }
Seq(1,2,3,4,5).reduce(+) 
// res0: Int = 15

или, дополнительно полагаясь на eta-расширение:

def +(a: Int, b: Int) = a + b
Seq(1,2,3,4,5).reduce(+)

Итак, вы можете ссылаться .reduce(+) на последовательностях, вам просто нужно либо значение + правильного типа (Int, Int) => Int (значение, а не метод), или вам нужен бинарный метод + в области видимости, которая принимает два целых числа и может быть расширена до (Int, Int) => Int,


На сообщения об ошибках

Сообщения об ошибках кажутся довольно однозначными. Если я не определю + сам и введите

Seq(1, 2).reduce(+)

в консоль, тогда я получаю

ошибка: не найдено: значение +

потому что нет никакой ценности + в любом месте. Я не знаю, как сообщение об ошибке может быть понятнее.

Другие вопросы по тегам