【问题标题】:Scala - understanding a code snippet involving curryingScala - 理解涉及柯里化的代码片段
【发布时间】:2012-09-27 10:31:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    你的解释是正确的。但你不需要所有这些大括号。

    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
    

    【讨论】:

    • +1,还可以补充一点,您不仅可以重写任何函数,而且 Scala 已经为此提供了函数上的 curried 方法。
    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2015-08-17
    • 2021-02-07
    • 2021-03-11
    • 2011-11-03
    相关资源
    最近更新 更多