2016-04-12 3 views
1

Я новичок в Scala, ниже три функции декларации, которые путая мне:Scala: Разница между декларациями функций

Первые

scala> def sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int 

Второй

scala> def sum (a: Int, b: Int) = a + b 
sum: (a: Int, b: Int)Int 

Третий

scala> val sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int = <function2> 

Я знаю, что второй метод, третий - это функция буква. Мое замешательство с первым объявлением, это нормальная функция или это какой-то другой синтаксис, который я не понимаю? Было бы полезно получить объяснение.

EDIT

Кроме того, когда я пытаюсь создать частично применяться функции с использованием первого заявления я получаю это:

scala> val anotherSum = sum _ 
anotherSum:() => (Int, Int) => Int = <function0> 

Что я ожидал типа Function2, как sum имеет 2 параметра ,

+0

Надеюсь, что это поможет: http://www.tutorialspoint.com/scala/scala_closures.htm. Копайте вокруг закрытий scala ,, – Pavel

+0

«Я знаю, что вторая является нормальной функцией» - Нет, второй - это метод, а не функция. Первый - также метод (хотя и тот, который возвращает функцию). Только третья функция. –

+0

@ JörgWMittag спасибо, я обновил свой вопрос. –

ответ

3

В первой и второй декларациях объявляются разные вещи. Это не то же самое с другим синтаксисом.

scala> def sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int 

Здесь вы определяете метод, названный sum, который не принимает никаких параметров и возвращает функцию, которая принимает два Int параметров и возвращает Int.

Так, sum является метод, что возвращает функцию, которая добавляет два числа.

scala> def sum (a: Int, b: Int) = a + b 
sum: (a: Int, b: Int)Int 

Здесь вы определяете метод, названный sum, который принимает два Int параметров и возвращает Int.

Таким образом, sum - это метод , который добавляет два номера.

Разница в том, что в первой версии sum не принимает параметров и возвращает функцию, а во втором - sum принимает два параметра и возвращает Int. Две очень разные вещи!

Третье:

scala> val sum = (a: Int, b: Int) => a + b 
sum: (Int, Int) => Int = <function2> 

Здесь вы определяете значение имени sum, который является Function2, другими словами, функция, которая принимает два Int параметров и возвращает Int.

Так, sum является значения что типа Function2, и относится к функции, которая добавляет два числа.

Extra:

scala> val anotherSum = sum _ 
anotherSum:() => (Int, Int) => Int = <function0> 

Посмотрите внимательно на тип. anotherSum - это функция, которая не принимает никаких параметров, возвращающих функцию, которая принимает два параметра Int, который возвращает Int.

Вы ничего не отменяете здесь. Section 6.7 Method Values Спецификации языка Scala объясняет, что здесь происходит.

+0

Спасибо за прекрасное объяснение. –

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