Currying

Curry

> LeekScript-zelfstudie

*Deze pagina is gedeeltelijk verouderd. In Leekscript wordt currying alleen gebruikt om de code leesbaarder te maken, het bespaart niet langer bewerkingen omdat de kosten van een aanroep naar een functie worden teruggebracht tot 1, ongeacht het aantal parameters. *

Bij functioneel programmeren verwijst currying naar de bewerking die een functie met meerdere argumenten overneemt naar een functie met één argument en een functie retourneert die de rest van de argumenten overneemt. De omgekeerde bewerking is uiteraard mogelijk en wordt decurryficatie genoemd.

De term komt van de naam van de Amerikaanse wiskundige Haskell Curry.

Voorbeeld in Leekscript

Laten we een functie nemen waaraan 2 argumenten moeten doorgegeven worden en die de som van de 2 teruggeeft:

functie optellen(x, y) { geef x+y terug; }

Verandert in curried-methode

functie add_curried(x) { retourfunctie(y) { geef x+y terug; }; }

Voorbeeld van gebruik

// Klassieke methode var som = optellen(1, 3);

// Curry-methode var add1 = add_curried(1); var som = optel1(3);

Dit voorbeeld is gewoon om te laten zien hoe het werkt, in dit geval heeft het geen zin om te gaan curryen. Laten we nog een interessanter voorbeeld bekijken. Stel je voor dat we een array van n numerieke elementen hebben en we willen 1 optellen bij alle elementen.

// Klassieke methode for(var key:var element in array) { array[sleutel] = toevoegen(1, element); }

// Curry-methode var add1 = add_curried(1); for(var key:var element in array) { array[sleutel] = add1(element); }

Het voordeel hier wordt gezien in termen van optimalisatie, in de lus in plaats van een functie aan te roepen met 2 parameters, roepen we alleen een functie aan met één parameter. Hoe groter het aantal elementen in de array, hoe groter de winst.

Wanneer is het de moeite waard om te curryen?

Zoals we eerder hebben gezien, wordt het voornamelijk gebruikt voor functies die in lussen worden aangeroepen en waarvan een of meer parameters niet afhankelijk zijn van de lus. Memoisatie is een perfect voorbeeld van gebruik.

Neem bijvoorbeeld onze functie lineOfSight met memoisatie ([hier] gedefinieerd(https://leekwars.com/encyclopedia/Optimisation#Utiliser_des_op%C3%A9rateurs_binaires)):

Als we deze functie in een lus aanroepen, zullen de twee bewerkingen ons zwaar belasten! Currificatie kan ons helpen:

Onze functie retourneert een andere functie, die de parameters van de eerste kan gebruiken, het is de eerste keer een beetje moeilijk te begrijpen, maar goed gebruikt, is deze methode zeer effectief! Een kleine oefening: we kunnen deze functie nog verder optimaliseren, het is aan jou om uit te vinden hoe!