2012-09-27 55 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