Почему можно использовать имя функции scala там, где ожидается значение функции, если это не само значение функции? - PullRequest
0 голосов
/ 05 мая 2020
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 Ответ

1 голос
/ 05 мая 2020

Что происходит?

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