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

scala通过嵌套函数或多个参数列表进行currying

发布时间:2020-12-16 09:28:42 所属栏目:安全 来源:网络整理
导读:在Scala中,我可以使用两个参数列表定义一个函数. def myAdd(x :Int)(y :Int) = x + y 这使得定义部分应用的函数变得容易. val plusFive = myAdd(5) _ 但是,我可以通过定义和返回嵌套函数来完成类似的事情. def myOtherAdd(x :Int) = { def f(y :Int) = x + y
在Scala中,我可以使用两个参数列表定义一个函数.

def myAdd(x :Int)(y :Int) = x + y

这使得定义部分应用的函数变得容易.

val plusFive = myAdd(5) _

但是,我可以通过定义和返回嵌套函数来完成类似的事情.

def myOtherAdd(x :Int) = {
    def f(y :Int) = x + y
    f _
  }

在美容方面,我已经移动了下划线,但这仍然感觉像是在干嘛.

val otherPlusFive = myOtherAdd(5)

我应该使用什么标准来偏好另一种方法?

解决方法

至少有四种方法可以完成同样的事情:

def myAddA(x: Int,y: Int) = x + y
val plusFiveA: Int => Int = myAddA(5,_)

def myAddB(x: Int)(y : Int) = x + y
val plusFiveB = myAddB(5) _

def myAddC(x: Int) = (y: Int) => x + y
val plusFiveC = myAddC(5)

def myAddD(x: Int) = {
  def innerD(y: Int) = x + y
  innerD _
}
val plusFiveD = myAddD(5)

您可能想知道哪个是最有效的,哪个是最好的风格(对于一些基于非绩效的最佳衡量标准).

就效率而言,事实证明所有四个基本上是等价的.前两种情况实际上发出完全相同的字节码; JVM对多个参数列表一无所知,所以一旦编译器计算出来(你需要在案例A上使用类型注释来帮助它),它就完全相同了.第三种情况也非常接近,但由于它预先承诺返回一个函数并在现场指定它,它可以避免一个内部字段.在完成的工作方面,第四种情况与前两种情况基本相同;它只是在方法内部而不是在外部转换为Function1.

在风格方面,我建议B和C是最好的方法,取决于你在做什么.如果您的主要用例是创建一个函数,而不是使用两个参数列表就地调用,那么使用C,因为它会告诉您它将要执行的操作. (例如,这个版本对于来自Haskell的人来说也特别熟悉.)另一方面,如果你大部分时间都要调用它,但偶尔会把它称之为咖喱,那就用B.再说一遍,它更清楚地说明了什么它应该做到.

(编辑:李大同)

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

    推荐文章
      热点阅读