Я понимаю, что здесь есть несколько вопросов о , что currying и частично примененные функции, но я спрашиваю, как они отличаются. В качестве простого примера, здесь используется кардинальная функция для нахождения четных чисел:
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)
.
Итак, мой вопрос: какое основное различие между этими двумя, и когда вы будете использовать один над другим? Является ли это слишком упрощенным примером, чтобы показать, почему один из них будет использоваться над другим?