Почему оставляя точку в 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)
Ответы
Ответ 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)
(_ * _)
Что не соответствует инфиксной нотации, поэтому ошибка.