Подтвердить что ты не робот

Почему оставляя точку в foldLeft, вызывают ошибку компиляции?

Может ли кто-нибудь объяснить, почему я вижу эту ошибку компиляции для следующего, когда я опускаю точечную нотацию для применения функции foldLeft? (версия 2.9.2)

scala> val l = List(1, 2, 3)
res19: List[Int] = List(1 ,2 ,3)

scala> l foldLeft(1)(_ * _)
<console>:9: error: Int(1) does not take parameters
                    l foldLeft(1)(_ * _)
                                    ^

но

scala> l.foldLeft(1)(_ * _) 
res27: Int = 6

Это не относится к другим функциям более высокого порядка, таким как map, которые, похоже, не заботятся о том, поставляю ли я точку или нет.

Я не думаю, что это ассоциативная вещь, потому что я не могу просто вызвать foldLeft(1)

4b9b3361

Ответ 1

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

scala> (l foldLeft 1)(_ * _)
res3: Int = 6

Oh - и в отношении вашего комментария о том, что вы не можете вызвать foldLeft(l), вы можете, но вам нужно частично применить его следующим образом:

scala> (l foldLeft 1) _
res3: ((Int, Int) => Int) => Int = <function1>

Ответ 2

Опускание точки возможно из-за синтаксической поддержки scala для нотации infix, которая ожидает 3 части:

leftOperand operator rightOperand. 

Но поскольку foldLeft имел два списка параметров, вы набираете 4 части на синтаксическом уровне: l foldLeft (1) (_ * _)

Что не соответствует инфиксной нотации, поэтому ошибка.