> LeekScript-opetusohjelma
*Tämä sivu on osittain vanhentunut. Leekscriptissä currya käytetään vain koodin luettavuuden parantamiseen, se ei enää tallenna toimintoja, koska funktion kutsun hinta laskee 1:een parametrien lukumäärästä riippumatta. *
Funktionaalisessa ohjelmoinnissa curryuksella tarkoitetaan operaatiota, joka muuttaa moniargumenttisen funktion yhden argumentin funktioksi ja palauttaa funktion, joka ottaa loput argumentit. Käänteinen toiminta on luonnollisesti mahdollista ja sitä kutsutaan decurryfiationiksi.
Termi tulee amerikkalaisen matemaatikon Haskell Curryn nimestä.
Otetaan funktio, joka ottaa 2 argumenttia ja palauttaa 2:n summan:
funktio add(x, y) { palauttaa x+y; }
Muuttuu curry-menetelmäksi
funktio add_curried(x) { paluufunktio(y) { palauttaa x+y; }; }
Esimerkki käytöstä
//Klassinen menetelmä var summa = add(1, 3);
//Curry-menetelmä var add1 = add_curried(1); var summa = add1(3);
Tämä esimerkki on vain yksinkertaisesti osoittamaan, kuinka se toimii, tässä tapauksessa ei ole mitään järkeä käydä läpi currya. Katsotaanpa toinen kiinnostavampi esimerkki. Kuvittele, että meillä on joukko n numeerista elementtiä ja haluamme lisätä 1 kaikkiin elementteihin.
//Klassinen menetelmä for(var key:var element taulukossa) { taulukko[avain] = lisää(1, elementti); }
//Curry-menetelmä var add1 = add_curried(1); for(var key:var element taulukossa) { taulukko[avain] = add1(elementti); }
Etu tässä nähdään optimoinnissa, silmukassa sen sijaan, että kutsumme funktiota, jossa on kaksi parametria, kutsumme vain funktiota yhdellä parametrilla. Mitä suurempi määrä elementtejä taulukossa on, sitä suurempi vahvistus.
Kuten olemme aiemmin nähneet, pääasiallinen käyttö on funktioita, joita kutsutaan silmukoiksi ja joiden yksi tai useampi parametreista ei riipu silmukasta. Memoization on täydellinen esimerkki käytöstä.
Otetaan esimerkiksi lineOfSight -toiminto, jossa on muistiinpano (määritetty täällä):
Jos kutsumme tätä funktiota silmukassa, nämä kaksi operaatiota painavat meitä! Currifikaatio voi auttaa meitä:
Funktiomme palauttaa toisen funktion, joka voi käyttää ensimmäisen parametreja, se on hieman vaikea ymmärtää ensimmäisellä kerralla, mutta hyvin käytettynä tämä menetelmä on erittäin tehokas! Pientä harjoitusta: voimme optimoida tämän toiminnon entistä enemmän, sinun on selvitettävä kuinka!
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.