2010-04-27 2 views
4

Являются ли эти две объявления функций эффективными?Объявление функций двумя способами. Что такое различие?

Если нет, то почему у них разные значения toString?

scala> def f: (Int) => Int = x=> x*x 
f: (Int) => Int 

scala> def f(x: Int) = x*x 
f: (Int)Int 
+0

это не ответ, но я предполагаю, что второй имеет тип возвращаемого вывода, и это различие, потому что у afaik Scala есть перегрузка оператора, что означает, что x * x не обязательно должен быть Int. –

+3

@Gabriel: Нет, в этом нет правды. –

ответ

18

Первый метод 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 _?

+0

Функция no-arg, возвращающая функцию, которая отображает Int в Int. Скала> f1 _ res6:() => (Int) => Int = Интересно, мы можем держать "подъем" ... Скала> res6 _ res7:() =>() => (Int) => Int = Скала> res7 _ res8:() =>() =>() => (Int) => Int = Scala> res8()()() (9) res9: Int = 81 Спасибо за информацию @retronym. Упражнение - приятное прикосновение! – Synesso

+0

BTW, точный термин для этого преобразования в Scala - это расширение Eta. См. «6.7 Значения метода» и «6.25.5 Расширение Eta» в http://www.scala-lang.org/docu/files/ScalaReference.pdf – retronym

4

Это объявления методов, а не декларации функций. Первый метод возвращает функцию, второй возвращает Int и не имеет ничего общего с функциями.

См. this question.

Смежные вопросы