gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:12:21 25 4
gpt4 key购买 nike

在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上添加类型注释来帮助它),其本质就一模一样。第三种情况也非常接近,但是由于它可以预先 promise 返回一个函数并在现场指定它,因此它可以避免一个内部字段。就完成的工作而言,第四种情况与前两种情况几乎相同。它只是在方法内部而不是外部进行到 Function1的转换。

在样式方面,我建议B和C是最好的选择,这取决于您在做什么。如果您的主要用例是创建一个函数,而不是用两个参数列表就地调用,请使用C,因为它可以告诉您它将要做什么。 (例如,对于来自Haskell的人来说,这个版本也特别熟悉。)另一方面,如果您大多打算将其调用到位,但偶尔会 curry 一下,然后使用B。再次,它更清楚地说明了什么它有望做到。

关于scala - 通过嵌套函数或多个参数列表进行scala curring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com