Почему можно использовать имя функции 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(_)).
  • недостаток всех автоматических и синтаксических сахарных штучек, которые делаются для вас, в том, что это может сбивать с толку
Другие вопросы по тегам