Currying

Currying

> LeekScript-veiledning

*Denne siden er delvis foreldet. I Leekscript brukes currying kun for å gjøre koden mer lesbar, det sparer ikke lenger operasjoner siden kostnaden for et kall til en funksjon reduseres til 1 uavhengig av antall parametere. *

I funksjonell programmering refererer currying til operasjonen som tar en flerargumentfunksjon til en ettargumentfunksjon og returnerer en funksjon som tar resten av argumentene. Den omvendte operasjonen er åpenbart mulig og kalles decurryfisering.

Begrepet kommer fra navnet til den amerikanske matematikeren Haskell Curry.

Eksempel i Leekscript

La oss ta en funksjon som tar 2 argumenter og returnerer summen av de 2:

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

Blir til curried metode

funksjon add_curried(x) { return funksjon(y) { returner x+y; }; }

Eksempel på bruk

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

//Karrimetoden var add1 = add_curried(1); var sum = add1(3);

Dette eksemplet er bare for å vise hvordan det fungerer, i dette tilfellet er det ingen vits å gå gjennom karry. La oss se et annet mer interessant eksempel. Tenk deg at vi har en matrise med n numeriske elementer og vi ønsker å legge til 1 til alle elementene.

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

//Karrimetoden var add1 = add_curried(1); for(var key:var element i array) { array[nøkkel] = add1(element); }

Fordelen her sees med tanke på optimering, i loopen i stedet for å kalle en funksjon med 2 parametere kaller vi kun en funksjon med en parameter. Jo større antall elementer i matrisen, desto større forsterkning.

Når er det verdt å karrye?

Som vi har sett tidligere, er hovedbruken for funksjoner som kalles i løkker og en eller flere av parameterne som ikke er avhengige av løkken. Memoisering er et perfekt eksempel på bruk.

Ta for eksempel vår lineOfSight-funksjon med memoisering (definert her):

Hvis vi kaller denne funksjonen i en loop, vil de to operasjonene tynge oss! Currification kan hjelpe oss:

Vår funksjon returnerer en annen funksjon, som kan bruke parameterne til den første, det er litt vanskelig å forstå første gang, men brukt godt er denne metoden veldig effektiv! En liten øvelse: vi kan optimere denne funksjonen enda mer, det er opp til deg å finne ut hvordan!