Что происходит?
В местах, где ожидается тип функции, f
преобразуется в анонимную функцию (x: Int) => f(x)
.
def f(x: Int): Boolean = (x >= 0 && x < 4)
// f // f itself is not a function value
f(_) // f(_) is an anonymous function
List(1, 3, 5).map(f) // f is converted to f(_) in places where a function type is expected
List(1, 3, 5).map(f(_)) // equivalent to last line
Почему f
не значение функции в первую очередь?
- Потому что функция без параметров
f
не была определена. Значение функции A curried (без параметров) будет работать:
val g = (x: Int) => (x >= 0 && x < 4)
g
Почему f
принимается как значение функции?
map
ожидает тип функции, и, поскольку каррированные и несжатые версии f
f
и g
оба делают то же самое, автоматическое преобразование c имеет смысл. - другое преимущество в том, что
map(f)
выглядит чище, чем map(f(_))
. - недостаток всех автоматических c и синтаксических c сахарных штучек, которые сделаны для вас, в том, что это может сбивать с толку