【发布时间】:2017-09-21 15:31:03
【问题描述】:
我正在尝试学习 Scala,但我很困惑何时使用柯里化函数而不是部分应用的函数。
我很确定这些概念并不是多余的,但我看不出不同方法的真正目的。
我正在试验这段代码:
解决方案使用柯里化:
object CurryTest extends App {
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)))
println(filter(nums, modN(3)))
}
解决方案使用部分应用函数:
object PartialFunctionTest extends App {
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,_)))
println(filter(nums, modN(3,_)))
}
两者都给出相同的结果:
List(2, 4, 6, 8)
List(3, 6)
这些不同的方法是否等效?
有人可以启发我,每种情况的最佳用例是什么?
【问题讨论】:
-
术语 nitpick:
modN(2, _)不是偏函数。它是一个部分应用的函数,尽管名称相似,但并不是一回事。见sandrasi-sw.blogspot.com/2012/03/…
标签: scala currying partial-application