curried函数的这种语法有什么区别吗?

时间:2013-07-31 15:00:41

标签: function scala arguments currying

另一个斯卡拉新手问题。

试图找出以下两者之间的区别:

def _1_sumUntil(n: Int) = (f: Int => Int) => (0 to n).toList.foldLeft(0){(a,b) => a + f(b)}

def _2_sumUntil(n: Int)(f: Int => Int) = (0 to n).toList.foldLeft(0){(a,b) => a + f(b)}

一个人的优势是什么(如果有的话)?

1 个答案:

答案 0 :(得分:3)

第一个是带有一个参数列表的方法,该列表返回从Int => IntInt的函数,第二个是带有两个返回Int的参数列表的方法。

从技术上讲,通过所谓的eta-expansion-一种方法可以透明地转换为函数值 - 第二种方法可以部分应用,产生与第一种方法相同的功能:

val a = _1_sumUntil(33)    // (Int => Int) => Int
val b = _2_sumUntil(33) _  // (Int => Int) => Int   via eta-expansion

我的建议是使用第二个变体并避免使用显式函数值。第二个优点是 - 除非你使用eta-expansion-没有实例化函数值(除了传递给foldLeft的函数)然后应用。它也可以说更容易阅读。

只有当方法的主要目的是为您提供从Int => IntInt传递的功能时,我才会使用第一个版本。


另请参阅this questionthis question