Scala: является ли оператор foldl инфиксным?

Глядя на код с foldl сложно понять его синтаксис, например:

  def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ):Map[String, Int] = {
    (map /: lst) (addToMap)
  }

Является ли /: инфиксным оператором? Что означает (map /: lst), частичное применение? Почему я не могу позвонить так:

`/:  map lst addToMap`

person Anton Ashanin    schedule 24.03.2013    source источник


Ответы (2)


Имена методов, оканчивающиеся на символ :, могут использоваться слева от экземпляра, к которому они привязаны (т. е. они связаны справа). В данном случае /: — это метод для List< /а>. Согласно Скаладоку:

Примечание: /: — это альтернативный синтаксис для foldLeft; z /: xs совпадает с xs foldLeft z.

Альтернативой тому, что вы написали, было бы:

lst./:(map)(addToMap)

Изменить: и еще одна альтернатива с foldLeft:

lst.foldLeft(map)(addToMap)
person Kristian Domagala    schedule 25.03.2013

Да, /: можно использовать как инфиксный оператор. Однако операция fold принимает три аргумента:

  1. Последовательность складывания
  2. Начальное значение для сокращения
  3. Функция, используемая для складывания

Используя инфикс, вы можете указать только два из этих трех аргументов: последовательность (которая является получателем) и начальное значение. Тот факт, что (map /: lst) является частичным приложением, отражает тот факт, что вам все еще не хватает аргумента. Вот пример произведения последовательности чисел, начиная с начального значения 1:

(1 /: xs)(_*_)

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

(1 /: xs) { (x, y) =>
    x * y
}
person DaoWen    schedule 25.03.2013