Codziennie czytam artykuły na temat programowania funkcjonalnego i staram się stosować jak najwięcej praktyk. Ale nie rozumiem, co jest wyjątkowego w curry lub częściowym stosowaniu.
Weź ten kod Groovy jako przykład:
def mul = { a, b -> a * b }
def tripler1 = mul.curry(3)
def tripler2 = { mul(3, it) }
Nie rozumiem, jaka jest różnica między tripler1
i tripler2
. Czy oba nie są takie same? „Curry” jest obsługiwane w czystych lub częściowych językach funkcjonalnych, takich jak Groovy, Scala, Haskell itp. Ale mogę zrobić to samo (lewe curry, prawe curry, n-curry lub częściowe zastosowanie), po prostu tworząc inny nazwany lub anonimowy funkcja lub zamknięcie, które przekaże parametry do pierwotnej funkcji (jak tripler2
) w większości języków (nawet C.)
Czy coś mi umyka? Są miejsca, w których mogę używać curry i częściowej aplikacji w mojej aplikacji Grails, ale waham się, aby to zrobić, ponieważ zadaję sobie pytanie „Jak to inaczej?”
Proszę, oświeć mnie.
EDYCJA: Czy mówicie, że częściowa aplikacja / curry jest po prostu bardziej wydajna niż tworzenie / wywoływanie innej funkcji, która przekazuje domyślne parametry do pierwotnej funkcji?
f x y = x + y
oznacza, że f
jest to funkcja, która przyjmuje jeden parametr int. Wynik f x
( f
zastosowany do x
) jest funkcją, która przyjmuje jeden parametr int. Wynik f x y
(lub (f x) y
np. f x
Zastosowany y
) jest wyrażeniem, które nie przyjmuje parametrów wejściowych i jest oceniane przez redukcję x + y
.