Scala - 理解涉及currying的代码片段

时间:2012-09-27 10:31:32

标签: scala

我是scala的新手,我在理解currying时遇到了一些麻烦 - 我现在正在练习编写简单的函数,并且需要澄清以下内容

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

以上功能定义是否与下面相同?

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

从语法中我可以将mul解释为接受整数的函数,并返回一个接受整数并返回整数的函数。但我不确定我的解释是否真的正确。有关上述示例或curried函数语法的任何解释都非常有用。

1 个答案:

答案 0 :(得分: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) _

通常,您可以将具有多个参数的任何函数重写为curried链,其中每个参数生成一个函数,该函数在最后一个参数实际生成值之前需要少一个参数:

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