我知道这里有几个问题关于什么柯里里和部分应用的功能,但我问他们是如何不同。作为一个简单的例子,这里是一个咖喱功能查找连号:斯卡拉柯里与部分应用的功能
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和non-curried版本的代价可能会不同,因此运行时性能可能也会受到影响。 (也就是说,如果优化器在两种情况下都不够聪明,无法选择最佳表示),但我不太熟悉Scala说明确切的区别。 – 2013-01-13 23:41:33
看看这个:http://stackoverflow.com/questions/8063325/usefulness-as-in-practical-applications-of-currying-vs-partial-application-i – Utaal
我发现这个解释非常有用,他解释了部分功能,部分应用的功能和咖喱,所有在一个职位:http://stackoverflow.com/a/8650639/1287554 –