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