2016-03-05 3 views
0

В Scala я обнаружил, что существует три способа создания функции, но я едва мог найти их разницу в поведении, когда я использую их как функцию.Как эти три подхода к определению функции различны?

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

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

scala> def incAnonymous = ((x : Int) => x + 1) 
incAnonymous: Int => Int 
+0

Как указано REPL, нет никакой разницы между первым и вторым объявлением, оба являются '(x: Int) Int' – cchantep

+0

Для подробной информации о разнице между вашим вторым и третьим вариантами взгляните на [ http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala](http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in -scala) – badcook

ответ

3

Это метод с одним параметром Int имени x, который возвращает Int (х + 1), где тип возвращаемого Int выводится компилятором.

def incImplicit(x: Int) = x + 1 

Это тот же точный метод, что и выше, за исключением того, что тип возврата является явным и не выводится.

def incImplicit(x: Int): Int = x + 1 

Это метод , что без параметров возвращает Function1[Int, Int] (который представляет собой функцию с одним параметром, который Int возвращает Int).

def incAnonymous = ((x : Int) => x + 1) 

т.е. длинная подпись выглядит следующим образом:

def incAnonymous: Function1[Int, Int] = ((x : Int) => x + 1) 

Или

def incAnonymous: Int => Int = ((x : Int) => x + 1) 

Функционально, они в значительной степени то же самое. Если в качестве параметра требуется Int => Int, скажем, для def map(f: Int => Int), все они будут работать. При вызове map(incImplicit) первые два (одинаковые точные методы, в любом случае) будут неявно преобразованы в функции на eta-expansion. map(incAnonymous) уже будет иметь правильную подпись и не требует преобразования.

incImplicit(x) и incAnonymous(x) всегда будут возвращать тот же результат для любого x. Единственное отличие состоит в том, что incImplicit является одним вызовом метода, а incAnonymous - это вызов метода, который возвращает функцию, и затем вызывается метод возвращаемой функции apply. Как правило, у вас не будет метода, который возвращает функцию, если у вас нет веских оснований для этого.