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>
确切的差异是什么?我何时应该使用哪种表格?
答案 0 :(得分:3)
区别在于
def f(x: Int)(y: Int) = x + y
是一个curried函数。具有两个参数列表的函数。您可以只使用一个参数,但是您需要指定哪个参数。
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
是部分应用功能。这里有一个函数,它接受一个参数并返回一个函数,该函数自带一个参数。
答案 1 :(得分:1)
使用第一种语法,您需要按照编译器的建议添加_
scala> f(42) _
res1: Int => Int = <function1>