/:
является синонимом foldLeft
и :\
для foldRight
.
Но помните, что :
делает /:
применимым к объекту справа от него.
Предполагая, что вы знаете, что (_ * _)
является анонимной функцией, эквивалентной (a, b) => a * b
, а сигнатуры foldLeft и foldRight равны
def foldLeft [B] (z: B)(f: (B, A) ⇒ B): B
def foldRight [B] (z: B)(f: (A, B) ⇒ B): B
, т.е. они являются функциями карри, принимающими начальное значение ифункция, объединяющая начальное значение / аккумулятор с элементом из списка, некоторые примеры:
List(1,2,3).foldLeft(1)(_*_)
, что совпадает с
(1 /: List(1,2,3))(_*_)
И
List(1,2,3).foldRight(1)(_*_)
в инфиксной записи:
(List(1,2,3) foldRight 1)(_*_)
, что совпадает с
(List(1,2,3) :\ 1)(_*_)
Добавляйте свои собственные коллекции и функции и наслаждайтесь!
Что нужно запомнить с помощьюКороткие (/:
и :\
) нотации заключаются в том, что, поскольку вы используете инфиксные нотации, вам необходимо поместить круглые скобки вокруг первой части, чтобы она правильно выбрала второй список аргументов.Также помните, что функции для foldLeft и foldRight противоположны, но это имеет смысл, если вы визуализируете сгиб в своей голове.