Function 多个参数列表和返回函数之间有什么区别?

Function 多个参数列表和返回函数之间有什么区别?,function,scala,partial-application,Function,Scala,Partial Application,def(x:Int)(y:Int)=x+y和def(x:Int)=(y:Int)=>x+y之间有什么区别 当我像对待后者一样对待前者时,REPL似乎并不高兴: 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 y

def(x:Int)(y:Int)=x+y
def(x:Int)=(y:Int)=>x+y
之间有什么区别

当我像对待后者一样对待前者时,REPL似乎并不高兴:

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>
scala>def(x:Int)(y:Int)=x+y
f:(x:Int)(y:Int)Int
scala>f(42)
:9:错误:缺少方法f的参数;
如果要将其视为部分应用的函数,请使用“\u1”遵循此方法
f(42)
^
scala>def(x:Int)=(y:Int)=>x+y
f:(x:Int)Int=>Int
scala>f(42)
res2:Int=>Int=

确切的区别是什么?我什么时候应该使用哪种形式?

对于第一种语法,您需要按照编译器的建议添加

scala> f(42) _
res1: Int => Int = <function1>
scala>f(42)_
res1:Int=>Int=

cf:

对于第一个语法,您需要按照编译器的建议添加

scala> f(42) _
res1: Int => Int = <function1>
scala>f(42)_
res1:Int=>Int=
cf:

区别在于

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
是一个部分应用函数。这里有一个接受一个参数的函数,返回一个接受一个参数本身的函数。

区别在于

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

是一个部分应用函数。这里有一个函数,它接受一个参数并返回一个接受一个参数本身的函数。

好的,一个函数有两个参数,一个函数返回一个接受一个参数的函数。否?我喜欢这样想,第一种方法是两个一元arglist返回一个
Int
(因此
f(0)
的结果仍然是一个方法
(y:Int)Int
),而后一种方法是一个一元arglist返回一元函数
Int=>Int
。这就解释了为什么只有前者抱怨缺少下划线
f(0)
在这种情况下,不会计算为函数。一个是具有两个参数的函数,另一个返回具有一个参数的函数。否?我喜欢这样想,第一种方法是两个一元arglist返回一个
Int
(因此
f(0)
的结果仍然是一个方法
(y:Int)Int
),而后一种方法是一个一元arglist返回一元函数
Int=>Int
。这就解释了为什么只有前者抱怨缺少下划线
f(0)
在这种情况下不会计算为函数。