2

def f(x: Int)(y: Int) = x + y和 和有什么不一样def f(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>

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

4

2 回答 2

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

这会将 的值设置y42
仅使用几个参数调用柯里化函数将生成部分应用函数。

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

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

于 2013-10-25T10:10:09.990 回答
1

使用第一种语法,您需要_按照编译器的建议添加

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

cf:为什么以及何时需要在方法名称后面加上 _?

于 2013-10-24T20:07:49.923 回答