Почему можно использовать имя функции Scala там, где ожидается значение функции, если это не само значение функции?
def f(x: Int): Boolean = (x >= 0 && x < 4)
List(1, 3, 5).map(f) // List(true, true, false)
f // does not compile
Почему можно f
использоваться там, где ожидается значение функции, даже если это не само значение функции?
1 ответ
Что случилось?
В местах, где ожидается тип функции, 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
не определился. Значениекаррированной функции(без параметров) будет работать:
val g = (x: Int) => (x >= 0 && x < 4)
g
Почему f
принято как значение функции?
map
ожидает тип функции, и посколькукаррированные и несложные версииf
f
а такжеg
оба делают то же самое, автоматическое преобразование имеет смысл.- еще одно преимущество в том, что
map(f)
имеет более чистый вид, чемmap(f(_))
. - недостаток всех автоматических и синтаксических сахарных штучек, которые делаются для вас, в том, что это может сбивать с толку