Я очень удивлен тем, что не смог найти существующий вопрос для этого. Почему это, учитывая:
val p: Int => Option[Int] = Some(_)
List(1, 2, 3).flatMap(p)
Я получаю:
<console>:14: error: type mismatch;
found : Int => Option[Int]
required: Int => scala.collection.GenTraversableOnce[?]
List(1, 2, 3).flatMap(p)
Но если я заменю последнюю строку на эту, она компилируется и работает как ожидалось:
List(1, 2, 3).flatMap(p(_))
Мое решение проблемы заключается в том, что в случае p(_)
система вывода типов выбирается, чтобы определить тип лямбда, и по пути находит соответствующее неявное преобразование для Option[Int]
(option2Iterable
, я считаю). Только с p
тип уже известен, и он неверен, поэтому никакое преобразование не выполняется (и нет преобразования для Function1
, возвращающего Option
в Function1
, возвращающего GenTraversableOnce
).
Правильно ли это рассуждение? И если да, то есть причина, почему я не должен сообщать об этом как об ошибке/проблеме?
EDIT: новый поворот: я видел p.apply
, упомянутый в некотором (к сожалению) удаленном комментарии (хотя это касалось стиля кодирования). Удивительно, но он работает так же хорошо, как и p(_)
.