Давайте посмотрим на вариант одного из ваших примеров:
myArray.count(!(_ % 2 == 0))
В этом фрагменте, поскольку выражение _ % 2 == 0
заключено в круглые скобки, компилятор сам анализирует его как анонимную функцию, а не все !(_ % 2 == 0)
, как можно было бы ожидать.
Рассматривая то, что в круглых скобках, как функцию, компилятор не знает, какой тип выбрать для заполнителя. Вы можете подумать, что можете исправить это, добавив аннотацию, дав
myArray.count(!((_: Int) % 2 == 0))
Но и это не сработает, потому что на самом деле вы применяете унарный оператор !
к созданной вами анонимной функции!
Чтобы обойти это, вы можете либо упростить свой предикат...
myArray.count(_ % 2 != 0)
... или вообще удалить заполнитель.
myArray.count(n => !(n % 2 == 0))
EDIT: Хотя приведенные выше предложения, вероятно, являются лучшими способами решения вашей проблемы, они не касаются напрямую сообщения об ошибке, которое вы получили, когда ввели следующее (недопустимое) выражение:
myArray.count(!_ % 2 == 0(_))
Здесь есть две проблемы. Во-первых, ваша анонимная функция _ % 2 == 0
не заключена в круглые скобки, из-за чего компилятор считает, что все выражение !_ % 2 == 0(_)
является анонимной функцией двух переменных.
Если мы заключим нашу анонимную функцию в круглые скобки, мы получим
myArray.count(!(_ % 2 == 0)(_))
Мы добились прогресса, так как компилятор больше не ищет два параметра, но он не может вывести тип заполнителя во встроенной функции, поэтому мы должны аннотировать его.
Наконец, у нас есть
myArray.count(!((_: Int) % 2 == 0)(_))
Это работает, как и ожидалось. Это, конечно, не так элегантно, как решения, представленные выше, но оно работает.
person
Jawshooah
schedule
30.09.2014
xyz
, пожалуйста - person Ben Reich   schedule 01.10.2014myArray.count
. - person Kigyo   schedule 01.10.2014