2012-09-27 86 views
4

我是新來斯卡拉,我有一個小麻煩了解柯里 - 我被編碼簡單的功能,現在練,並需要澄清以下斯卡拉 - 理解的代碼片段涉及討好

def mul (a: Int) (b: Int): Int = 
    { 
    { 
    a * b 
    } 
    } 

上述函數定義是否與下面相同?

def mul: Int => Int => Int = { 
    (a: Int) => 
    { 
     (b: Int) => 
     a * b 
    } 
} 

從語法我可以解釋mul爲接受一個整數,並返回接受一個整數並返回一個整數的函數的函數。但我不確定我的解釋是否確實是正確的。關於上述例子或curried函數的語法的任何解釋都會很有幫助。

回答

10

您的解釋是正確的。但你並不需要所有的大括號。

def mul(a: Int)(b: Int) = a*b 

val mulAB = (a: Int) => { (b: Int) => a*b } // Same as mul _ 
val mul5B = (b: Int) => 5*b     // Same as mulAb(5) or mul(5) _ 

在一般情況下,你可以重寫與多個參數作爲咖喱鏈代替,其中每個參數產生一個函數,少一個參數的任何功能,直到最後一個實際產生的價值:

f(a: A ,b: B ,c: C, d: D): E <===> A => B => C => D => E 

在Scala中,自然分組是參數塊,不是由個別參數,所以

f(a: A)(b: B, c: C)(d: D): E <===> A => (B,C) => D => E 
+4

+1,這可能是不錯的一個dd你不能只重寫任何函數,但Scala已經在函數中提供了'curried'方法。 – Frank