Почему типы именованной функции отличаются от анонимной в scala

В scala именованная функция определяется как:

scala> def addOne(x: Int): Int = x+1
addOne: (x: Int)Int

scala> :type addOne
(x: Int)Int

И анонимный как:

scala> val addOne = (x:Int) => x+1
addOne: Int => Int = <function1>

scala> :type addOne
Int => Int

Почему их типы выглядят иначе?

Почему нельзя передать именованную функцию в качестве аргумента другой функции?

Не следует ли рассматривать и то и другое единообразно с точки зрения типа и поведения первого порядка?


person Niket Kumar    schedule 05.07.2013    source источник


Ответы (1)


def addOne(x: Int): Int не является функцией в scala. Это метод какого-то объекта.

Такие функции, как val addOne = (x:Int) => x+1, являются объектами типа FunctionN (в данном случае Function1) с методом apply.

Можно использовать метод как функцию в scala - компилятор может создать функцию из метода, например:

scala> List(1, 2, 3).map((1).+) // or just `1+`
res0: List[Int] = List(2, 3, 4)

В этом случае метод + объекта 1 используется как функция x => (1).+(x).

scala> List(1, 2, 3).foreach(println)
1
2
3

Метод println объекта Predef используется как функция s => Predef.println(s).

Начиная с версии 2.10 нельзя использовать :type в методах:

scala> def addOne(x: Int): Int = x+1
addOne: (x: Int)Int

scala> :type addOne
<console>:9: error: missing arguments for method addOne;
follow this method with `_' if you want to treat it as a partially applied function
       addOne
       ^
person senia    schedule 05.07.2013