Первый метод f1
без аргументов, который возвращает Function1[Int, Int]
.
scala> def f1: (Int => Int) = (x: Int) => x * x
f1: (Int) => Int
Второй метод f2
один аргумент, который принимает в Int
и возвращает Int
.
scala> def f2(x: Int): Int = x * x
f2: (x: Int)Int
Вы можете вызвать f1 и f2 с тем же синтаксисом, хотя при вызове f1(2)
она расширяется до f1.apply(2)
.
scala> f1
res0: (Int) => Int = <function1>
scala> f1(2)
res1: Int = 4
scala> f1.apply(2)
res2: Int = 2
scala> f2(2)
res3: Int = 4
Наконец, вы можете «поднять» метод f2
к функции следующим образом.
scala> f2
<console>:6: error: missing arguments for method f2 in object $iw;
follow this method with `_' if you want to treat it as a partially applied funct
ion
f2
^
scala> f2 _
res7: (Int) => Int = <function1>
scala> (f2 _).apply(2)
res8: Int = 4
Упражнение: Что такое тип f1 _
?
это не ответ, но я предполагаю, что второй имеет тип возвращаемого вывода, и это различие, потому что у afaik Scala есть перегрузка оператора, что означает, что x * x не обязательно должен быть Int. –
@Gabriel: Нет, в этом нет правды. –