加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:20:02 所属栏目:安全 来源:网络整理
导读:我是 scala的新手,我在理解currying方面遇到了一些麻烦 – 我现在正在通过编写简单的函数来练习,并且需要澄清以下内容 def mul (a: Int) (b: Int): Int = { { a * b } } 以上功能定义是否与以下相同? def mul: Int = Int = Int = { (a: Int) = { (b: Int) =
我是 scala的新手,我在理解currying方面遇到了一些麻烦 – 我现在正在通过编写简单的函数来练习,并且需要澄清以下内容

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

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

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

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

解决方法

你的解释是正确的.但你不需要所有那些支撑.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读