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)
在这种情况下不会计算为函数。