2

另一个 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)}

一个比另一个有什么优势(如果有的话)?

4

1 回答 1

3

第一个是带有一个参数列表的方法,它返回一个函数 from Int => Intto Int,第二个是一个带有两个参数列表的方法,它返回一个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 => Int版本Int


另见这个问题这个问题

于 2013-07-31T16:32:53.480 回答