2013-03-24 2 views
2

Глядя на код с foldl это трудно понять его синтаксис, например:Scala: Является ли оператор foldl infix?

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

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

`/: map lst addToMap` 

ответ

5

Имена методов, которые заканчиваются в : символ может быть использован на левой стороне, например, они связаны с (то есть, они ассоциируют справа). В этом случае /: является method on List. В соответствии с Scaladoc:

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

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

lst./:(map)(addToMap) 

Edit: и другая альтернатива с foldLeft:

lst.foldLeft(map)(addToMap) 
+0

Kristian, @DaoWen, Как я понимаю, 'foldLeft' имеет два аргумента - начальное значение и функцию сгибания. Тогда почему 'lst.foldLeft (map, addToMap)' приводит к ошибке 'слишком много аргументов для метода foldLeft: (z: B) (f: (B, (String, Int)) => B) B'? –

+1

'foldLeft' имеет две группы параметров (как видно по двум группам скобок) - первая группа ожидает один аргумент, который является причиной сообщения об ошибке. Второй аргумент относится ко второй группе. Я отредактировал ответ на примере с помощью 'foldLeft'. Как вы можете видеть, это буквально замена для '/:' –

+0

Kristian, спасибо! Где читать о группах параметров функции Scala? Не удается найти это в документах до сих пор ... –

2

Да, /: может быть использован в качестве оператора инфиксного. Тем не менее, раз операция занимает три аргументы:

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

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

(1 /: xs)(_*_) 

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

(1 /: xs) { (x, y) => 
    x * y 
} 
Смежные вопросы