/:
является синонимом 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 противоположны, но это имеет смысл, если вы визуализируете складку в уме.
person
Luigi Plinge
schedule
07.09.2011