scala通过嵌套函数或多个参数列表进行currying
在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.再说一遍,它更清楚地说明了什么它应该做到. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |