4

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

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

上面的函数定义和下面的一样吗?

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

从语法我可以解释mul为一个接受整数的函数,并返回一个接受整数并返回整数的函数。但我不确定我的解释是否真的正确。关于上述示例或柯里化函数语法的任何解释都会非常有帮助。

4

1 回答 1

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
于 2012-09-27T11:31:37.463 回答