Я каждый день читаю статьи по функциональному программированию и стараюсь как можно больше применять некоторые практики. Но я не понимаю, что уникально в карри или частичном применении.
Возьмем этот Groovy-код в качестве примера:
def mul = { a, b -> a * b }
def tripler1 = mul.curry(3)
def tripler2 = { mul(3, it) }
Я не понимаю, в чем разница между tripler1и tripler2. Разве они не одинаковы? 'Curry' поддерживается в чистых или частично функциональных языках, таких как Groovy, Scala, Haskell и т. Д. Но я могу сделать то же самое (левое карри, правое карри, n-карри или частичное приложение), просто создав другое именованное или анонимное функция или замыкание, которое будет перенаправлять параметры в исходную функцию (например tripler2) на большинстве языков (даже на C.)
Я что-то здесь упускаю? Есть места, где я могу использовать карри и частичную аппликацию в своем приложении Grails, но я не решаюсь сделать это, потому что спрашиваю себя: "Как это отличается?"
Пожалуйста, просветите меня.
РЕДАКТИРОВАТЬ: Вы, ребята, говорите, что частичное применение / каррирование просто более эффективно, чем создание / вызов другой функции, которая перенаправляет параметры по умолчанию в исходную функцию?
f x y = x + yозначает, что fэто функция, которая принимает один параметр int. Результатом f x( fприменяется к x) является функция, которая принимает один параметр типа int. Результат f x y(или (f x) y, т. f xЕ. Примененный к y) является выражением, которое не принимает входных параметров и оценивается путем сокращения x + y.