Ответ 1
Проблема состоит в том, что синтаксический анализ Scala для анонимных функций с явными типами аргументов неоднозначен, и иногда это приводит к некоторым очень странным причудам. Это одна из них. Возьмем следующее выражение:
(qr:QualityReview => qr.reviewNumber == number)
Scala (по-видимому) анализирует это следующим образом:
(qr:(QualityReview => qr.reviewNumber == number))
Это не то, что вы хотели. На самом деле это даже не анонимная функция. Дезаурирование выражения дает следующее:
(qr: Function1[QualityReview, ==[qr.reviewNumber, number]])
Итак, мы приписываем тип qr
, где этот тип задается параметром Function1
с параметром QualityReview
и типом, заданным параметром ==
, параметризованным типами qr.reviewNumber
и number
. Все это действительно Scala, и я подозреваю, что ничто из этого не предназначено.
Ошибка возникает, когда Scala ищет тип с именем ==
, который, конечно, он не находит (он может существовать, но это не так). Если бы эта ошибка прошла, она бы быстро столкнулась с проблемами поиска типов qr.reviewNumber
и number
.
Есть несколько способов избежать этой проблемы. В общем, я просто рекомендую использовать несколько иной стиль при объявлении ваших функций. Scala Руководство по стилю - это хорошее место для начала. В случае этой функции наиболее простым способом устранения проблемы является удаление аннотации типа (QualityReview
). Вы также можете решить проблему, поставив круглые скобки вокруг qr:QualityReview
. Кроме того, я думаю, что пробел после двоеточия может решить проблему, хотя я не могу быть уверен. Наконец, использование фигурных скобок, а не круглых скобок, обычно делает компилятор предпочтительным интерпретировать =>
как разделитель лямбда, а не тип. Я бы написал ваше выражение exists
следующим образом:
!(qrList exists { qr => qr.reviewNumber == number })
Собственно, я, вероятно, использовал бы синтаксис подчеркивания, но это совершенно другой вопрос.: -)
!(qrList exists { _.reviewNumber == number })