Function curry函数的这种语法有什么不同吗?

Function curry函数的这种语法有什么不同吗?,function,scala,arguments,currying,Function,Scala,Arguments,Currying,另一个Scala新手问题 试图找出以下两者之间的区别: def _1_sumUntil(n: Int) = (f: Int => Int) => (0 to n).toList.foldLeft(0){(a,b) => a + f(b)} 及 一种方法比另一种方法有什么好处(如果有的话)?第一种方法有一个参数列表,将函数从Int=>Int返回到Int,第二种方法有两个参数列表,返回Int 从技术上讲,通过所谓的eta-扩展,方法可以透明地转换为函数值-,第二种方法可以部分应用

另一个Scala新手问题

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

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


一种方法比另一种方法有什么好处(如果有的话)?

第一种方法有一个参数列表,将函数从
Int=>Int
返回到
Int
,第二种方法有两个参数列表,返回
Int

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

val a = _1_sumUntil(33)    // (Int => Int) => Int
val b = _2_sumUntil(33) _  // (Int => Int) => Int   via eta-expansion
我的建议是使用第二个变量,避免显式函数值。第二种方法的优点是,除非使用eta扩展,否则不会实例化函数值(除了传递给
foldLeft
的函数),然后应用该函数值。此外,它可以说更容易阅读

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



另请参见和。

@om nom nom它被称为“咖喱”,而不是“携带”@IonuțG.Stan yep,抱歉:-(如果两者都达到相同的效果,那么两者相比有什么优势?@user1189332不幸的是,在Scala中,方法和函数是不同的:。有关简单的区别,请参见以下要点:
val a = _1_sumUntil(33)    // (Int => Int) => Int
val b = _2_sumUntil(33) _  // (Int => Int) => Int   via eta-expansion