Почему я не могу уменьшить (+) на последовательность целых чисел в 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(+)
в консоль, тогда я получаю
ошибка: не найдено: значение +
потому что нет никакой ценности +
в любом месте. Я не знаю, как сообщение об ошибке может быть понятнее.