2013-10-24 3 views
2

В чем разница между def f(x: Int)(y: Int) = x + y и def f(x: Int) = (y: Int) => x + y?В чем разница между несколькими списками аргументов и возвратом функции?

РЕПЛ не кажется счастливым, когда я лечу бывший так же, как последний:

scala> def f(x: Int)(y: Int) = x + y 
f: (x: Int)(y: Int)Int 

scala> f(42) 
<console>:9: error: missing arguments for method f; 
follow this method with `_' if you want to treat it as a partially applied function 
       f(42) 
      ^

scala> def f(x: Int) = (y: Int) => x + y 
f: (x: Int)Int => Int 

scala> f(42) 
res2: Int => Int = <function1> 

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

+0

Ну, это функция с двумя аргументами, а одна возвращает функцию, которая принимает один аргумент. Нет? –

+0

То, как мне нравится думать, это первый метод с двумя унарными архлистами, возвращающими 'Int' (поэтому результат' f (0) 'по-прежнему является методом' (y: Int) Int'), тогда как последний - это метод с одним унарным аргументом, возвращающим унарную функцию 'Int => Int'. Это объясняет, почему только первый жалуется на недостающее подчеркивание; 'f (0)' в этом случае не оценивает функцию. – Hugh

ответ

3

Разница заключается в том

def f(x: Int)(y: Int) = x + y 

является кэрри функции. Функция с двумя параметрами. Вы можете использовать его только с одним аргументом, но вам нужно указать, какой из них.

f(42) _ // this is short for f(42)(_: Int) 

будет генерировать частичную прикладную функцию, где значение x является 42. Вы также можете сделать:

f(_: Int)(42) // note: the first parameter must be used this way 

Это установит значение y в 42.
Вызов функции curried с несколькими параметрами приведет к частичной прикладной функции.

def f(x: Int) = (y: Int) => x + y 

- частичная прикладная функция. Здесь у вас есть функция, которая принимает один аргумент и возвращает функцию, которая принимает сам аргумент.