Currying

Currying

> LeekScript-vejledning

*Denne side er delvist forældet. I Leekscript bruges currying kun for at gøre koden mere læsbar, det gemmer ikke længere operationer, da omkostningerne ved et opkald til en funktion reduceres til 1 uanset antallet af parametre. *

I funktionel programmering refererer currying til den operation, der tager en multi-argument-funktion til en et-argument-funktion og returnerer en funktion, der tager resten af argumenterne. Den omvendte operation er naturligvis mulig og kaldes decurryfication.

Udtrykket kommer fra navnet på den amerikanske matematiker Haskell Curry.

Eksempel i Porreskrift

Lad os tage en funktion, der tager 2 argumenter og returnerer summen af de 2:

funktion add(x, y) { returner x+y; }

Bliver til curry metode

function add_curried(x) { returner funktion(y) { returner x+y; }; }

Eksempel på brug

//Klassisk metode var sum = add(1, 3);

//Karry metode var add1 = add_curried(1); var sum = add1(3);

Dette eksempel er blot for at vise, hvordan det fungerer, i dette tilfælde er der ingen mening i at gå gennem curry. Lad os se et andet mere interessant eksempel. Forestil dig, at vi har en matrix af n numeriske elementer, og vi vil tilføje 1 til alle elementerne.

//Klassisk metode for(var nøgle:var element i array) { array[key] = add(1, item); }

//Karry metode var add1 = add_curried(1); for(var nøgle:var element i array) { array[nøgle] = add1(element); }

Fordelen her ses i forhold til optimering, i løkken i stedet for at kalde en funktion med 2 parametre kalder vi kun en funktion med en parameter. Jo større antal elementer i arrayet, jo større forstærkning.

Hvornår er det værd at karrye?

Som vi har set tidligere, er hovedanvendelsen til funktioner kaldet i loops og en eller flere af hvis parametre ikke afhænger af loopen. Memoisering er et perfekt eksempel på brug.

Tag for eksempel vores lineOfSight-funktion med memoization (defineret her):

Hvis vi kalder denne funktion i en løkke, vil de to operationer tynge os ned! Currification kan hjælpe os:

Vores funktion returnerer en anden funktion, som kan bruge parametrene for den første, det er lidt svært at forstå første gang, men brugt godt er denne metode meget effektiv! En lille øvelse: vi kan optimere denne funktion endnu mere, det er op til dig at finde ud af hvordan!