function - 这种柯里化(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)}

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

其中一种相对于另一种的优势是什么(如果有的话)?

最佳答案

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

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

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 .

关于function - 这种柯里化(Currying)函数的语法有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17973979/

相关文章:

MySQL UDF/存储函数无法识别作为参数传递的表名

javascript - 函数不返回任何内容(甚至没有未定义)

scala - 为什么我不能在 Option[List] 上调用 flatMap

Scala/Lift检查日期格式是否正确

Javascript 参数转移

javascript - 在这种情况下 'pass result to parameter' 意味着什么?

无法将用户输入保存到变量中

list - 在 Scala 中对两个列表进行排序

javascript - 使用参数作为变量名 (Javascript)

c - C 中函数参数的自省(introspection)是否可能?