TypeScript Academy · Oppitunti

Currying ja osittainen soveltaminen

Muuntaa usean argumentin funktiot curried-muotoon.

Oppitunti 2/413 vaihetta

Currying ja osittainen soveltaminen on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu TypeScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä currying tarkoittaa?

Currying muuntaa usean argumentin funktion yksittäisten argumenttien funktioiden ketjuksi. Sen sijaan että kutsuisitte f(a, b), kutsutte f(a)(b).

Perusesimerkki

Tässä add ottaa yhden luvun ja palauttaa funktion, joka odottaa seuraavaa lukua. TypeScript päättelee sisäkkäisten funktioiden tyypit automaattisesti.

const add = (a: number) => (b: number) => a + b;
console.log(add(2)(3)); // 5

Curried-funktion tyypitys

Eksplisiittinen tyyppi näyttää ketjun selkeästi: funktio palauttaa funktion. Jokainen nuoli vastaa yhtä argumenttia.

type Add = (a: number) => (b: number) => number;
const add: Add = a => b => a + b;
console.log(add(10)(5)); // 15

Osittainen soveltaminen

Osittaisessa soveltamisessa osa argumenteista annetaan nyt ja loput myöhemmin. Curried-funktiolla tämä tarkoittaa yksinkertaisesti sen kutsumista harvemmilla vaiheilla.

const add = (a: number) => (b: number) => a + b;
const add10 = add(10); // partially applied
console.log(add10(1), add10(2)); // 11 12

Osittaisen soveltamisen hyödyt

Voitte muodostaa yleisistä funktioista erikoistuneita funktioita. add10 on uudelleenkäytettävä ja nimetty työkalu, joka on johdettu yleisestä add-funktiosta. Tämä parantaa luettavuutta ja uudelleenkäytettävyyttä.

Kolmen argumentin currying

Malli toimii millä tahansa argumenttimäärällä. Jokainen taso sulkee yhden argumentin sulkeumaan, kunnes lopullinen arvo tuotetaan.

const clamp = (min: number) => (max: number) => (x: number) =>
  Math.min(Math.max(x, min), max);
const toByte = clamp(0)(255);
console.log(toByte(300), toByte(-5)); // 255 0

Sopii mainiosti map- ja filter-metodeihin

Curried-funktiot sopivat hyvin taulukkometodeihin, koska map odottaa yhden argumentin funktiota. Osittainen soveltaminen tuottaa juuri tällaisen funktion.

const mul = (a: number) => (b: number) => a * b;
const triple = mul(3);
console.log([1, 2, 3].map(triple)); // [3, 6, 9]

Geneerinen curry-apufunktio

Voitte kirjoittaa tyypitetyn apufunktion, joka muuntaa kaks argumenttia ottavan funktion curried-muotoon. Geneeriset tyypit säilyttävät parametri- ja paluuarvojen tyypit täsmällisinä.

function curry2<A, B, R>(f: (a: A, b: B) => R) {
  return (a: A) => (b: B) => f(a, b);
}
const join = curry2((a: string, b: string) => a + b);
console.log(join("foo")("bar")); // foobar

Sulkeumat kaappaavat argumentit

Currying toimii, koska jokainen palautettu funktio sulkee aiemmat argumentit sulkeumaansa. Arvot pysyvät käytettävissä, kunnes viimeinen kutsu käyttää niitä.

const greet = (greeting: string) => (name: string) =>
  greeting + ", " + name;
const hi = greet("Hi");
console.log(hi("Sam")); // Hi, Sam

Milloin curryingia ei kannata käyttää

Kaikkien funktioiden muuttaminen curried-muotoon voi heikentää luettavuutta. Käyttäkää sitä, kun osittaisesta soveltamisesta on aidosti hyötyä, esimerkiksi uudelleenkäytettävien apufunktioiden määrittämisessä tai käsittelyputkien koostamisessa.

Currying ja oletusargumentit

Oletusparametrit tarjoavat oletusarvoja, mutta eivät vaiheittaista soveltamista. Currying tarjoaa aidon osittaisen soveltamisen ja palauttaa varsinaisen funktion, jonka voitte välittää eteenpäin ja käyttää uudelleen.

Pikatarkistus

Tämän oppitunnin pikatarkistus.

Kertaus

Currying muuttaa muodon f(a, b) muotoon f(a)(b): kyseessä on sisäkkäisten nuolityyppien muodostama yhden argumentin funktioiden ketju. Osittaisessa soveltamisessa alkuosan argumentit kiinnitetään uudelleenkäytettävien erikoistettujen funktioiden muodostamiseksi, sulkeumien avulla.

Aloita maksutta

Opi TypeScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
101
Oppitunnit
352

Usein kysytyt kysymykset

Onko oppitunti ”Currying ja osittainen soveltaminen” ilmainen?

Kyllä – oppitunnin ”Currying ja osittainen soveltaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko TypeScript Academy-kurssin, päivitä CoddyKit PROhon. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Currying ja osittainen soveltaminen”?

Muuntaa usean argumentin funktiot curried-muotoon. Harjoittelet TypeScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni TypeScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin TypeScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Currying ja osittainen soveltaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä TypeScript Academy-oppitunnilla?

Kyllä. Jokainen TypeScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Puhtaat funktiot ja muuttumattomuus
  2. Currying ja osittainen soveltaminen
  3. Funktioiden koostaminen tyyppien avulla
  4. Tyypitetyt pipe- ja flow-apufunktiot
← Takaisin: TypeScript Academy