【发布时间】:2012-12-27 21:14:23
【问题描述】:
我意识到这里有几个关于什么柯里化和部分应用函数是的问题,但我想问的是它们有何不同。举个简单的例子,这里有一个查找偶数的柯里化函数:
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
if (xs.isEmpty) xs
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
else filter(xs.tail, p)
def modN(n: Int)(x: Int) = ((x % n) == 0)
所以你可以编写以下代码来使用它:
val nums = List(1,2,3,4,5,6,7,8)
println(filter(nums, modN(2))
返回:List(2,4,6,8)。但我发现我可以用这种方式做同样的事情:
def modN(n: Int, x: Int) = ((x % n) == 0)
val p = modN(2, _: Int)
println(filter(nums, p))
也返回:List(2,4,6,8)。
所以我的问题是,两者之间的主要区别是什么,您什么时候会使用其中一个而不是另一个?这是不是过于简单化的例子,无法说明为什么要使用一个而不是另一个?
【问题讨论】:
-
部分应用时,在内存中表示 curried 和非 curried 版本的成本可能不同,因此运行时性能也可能会受到影响。 (也就是说,如果优化器不够聪明,无法在两种情况下选择最佳表示。)不过,我对 Scala 还不够熟悉,无法说出确切的区别。
-
我发现这个解释非常有用,他在一篇文章中解释了部分函数、部分应用函数和柯里化:stackoverflow.com/a/8650639/1287554
-
优秀的链接,@PlastyGrove。谢谢!
-
感谢@Utaal 提供的链接。 Martin Odersky 本人的任何回答都非常有价值。我认为这些概念现在开始流行了。
标签: scala functional-programming currying