2013-10-24 34 views
2

def f(x: Int)(y: Int) = x + ydef 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

那麼,一個是帶有兩個參數的函數,另一個返回帶有一個參數的函數。沒有? –

+0

我喜歡想到的方式是,第一種方法是有兩個一元參數返回一個'Int'(所以'f(0)'的結果仍然是一個方法'(y:Int)Int'),而後者是一個一元arglist返回一元函數'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 

是部分應用功能。這裏有一個函數,它接受一個參數並返回一個函數,該函數接受一個參數本身。

相關問題