TypeScript Academy · Oppitunti

Kevyt HKT-malli

Toteuttakaa Kind/URI-defunktionalisointitemppu.

Oppitunti 3/413 vaihetta

Kevyt HKT-malli on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Defunktionalisointi

Koodauksen taustalla olevalla tempulla on nimi: defunktionalisointi. Oikean korkeamman asteen tyyppifunktion sijaan edustamme kutakin funktiota tunnisteella ja ratkaisemme sen yhdellä ensimmäisen kertaluvun haulla. URItoKind-rekisteri on tämä hakutaulukko.

type Kind<F extends URIS, A> = URItoKind<A>[F];
// One lookup replaces true type-function application

Kind-tyyppi

Kind<F, A> on mallin julkinen rajapinta. Lukekaa se muodossa ”konstruktori F sovellettuna tyyppiin A”. Se piilottaa rekisterin indeksoinnin selkeän nimen taakse.

type A = Kind<"Array", number>;  // number[]
type B = Kind<"Option", string>; // string | null

F:n rajoittaminen URIS-tyyppiin

F:n on oltava rekisteröity URI. Rajoittakaa se muodolla extends URIS, jotta vain kelvollisia tunnisteita voidaan käyttää ja kirjoitusvirheet muuttuvat käännösvirheiksi.

type Kind<F extends URIS, A> = URItoKind<A>[F];

// Kind<"Arrey", number> -> error, not a valid URI

Yleisten allekirjoitusten kirjoittaminen

Nyt voimme kirjoittaa aiemmin mahdottoman Functor-allekirjoituksen. Korvatkaa jokainen F<A> muodolla Kind<F, A>, jolloin kääntäjä hyväksyy sen.

interface Functor<F extends URIS> {
  map<A, B>(fa: Kind<F, A>, f: (a: A) => B): Kind<F, B>;
}

Ratkaisu käytännössä

Kun kiinnitätte F:n konkreettiseen URIin, Kind ratkeaa oikeaksi säilötyypiksi. Functor<"Array">-tyypillä on map, joka muuntaa tyypin A[] tyypiksi B[].

type ArrayFunctor = Functor<"Array">;
// map: <A, B>(fa: A[], f: (a: A) => B) => B[]

Useita tyyppiargumentteja

Jotkin konstruktorit ottavat kaksi argumenttia, kuten Either<E, A>. fp-ts laajentaa mallia tyypeillä URItoKind2 ja Kind2<F, E, A> tyyppiä * -> * -> * varten. Idea skaalautuu lisäämällä rekistereitä.

interface URItoKind2<E, A> {
  Either: { left: E } | { right: A };
}
type Kind2<F extends URIS2, E, A> = URItoKind2<E, A>[F];

fp-ts:n käytäntö

fp-ts vakiinnutti käytännön, jota koko tämä kurssi noudattaa: yksi URI-merkkijono tietotyyppiä kohden, deklaratiivisella yhdistämisellä laajennettava URItoKind-rekisteri sekä ratkaisemiseen käytettävä Kind. Kun tunnistatte tämän käytännön, pystytte lukemaan fp-ts:n ja Effectin tyyppiallekirjoituksia.

// In fp-ts you will see exactly:
// declare module "fp-ts/HKT" { interface URItoKind<A> { ... } }

Instanssitietue

Abstraktion ”instanssi” on arvo, joka toteuttaa abstraktion tietylle URIlle. Instanssi sisältää konkreettisen map-toteutuksen. Kirjoitamme Array-instanssin seuraavalla oppitunnilla; tässä näette sen rakenteen.

declare const arrayFunctor: Functor<"Array">;
const out = arrayFunctor.map([1, 2, 3], n => n * 2); // number[]

Miksi tämä on ”kevyt”

Tätä kutsutaan kevyeksi HKT-malliksi, koska se ei tarvitse kääntäjämuutoksia tai erityistä syntaksia, vaan ainoastaan rajapintoja ja indeksoitua käyttöä. Vastineeksi aidosti säilöistä yleiselle koodille joudutaan kirjoittamaan hieman ylimääräistä rakennetta (URIt ja rekisterit).

type Kind<F extends URIS, A> = URItoKind<A>[F];
// No magic, just a typed lookup table

Rajoitukset

Malli on monisanainen, ja virheilmoitukset voivat olla vaikeaselkoisia, koska niissä mainitaan koodaus toimialanne sijaan. Lisäksi jokainen säilö on rekisteröitävä. Useimmissa sovelluksissa käytätte kirjastoja, jotka hoitavat tämän jo valmiiksi, sen sijaan että rakentaisitte mallin itse.

// Trade-off: real abstraction power vs. encoding ceremony

Kokonaisuuden kokoaminen

Kevyen HKT-mallin koko resepti on seuraava: määritelkää URI, rekisteröikää se URItoKind-rekisteriin, määritelkää abstraktiot käyttäen muotoa Kind<F, A> ja tarjotkaa instanssit kutakin URIa varten. Siinä on koko TypeScriptin yleisten funktionaalisten kirjastojen taustalla oleva työkalupakki.

type Kind<F extends URIS, A> = URItoKind<A>[F];
interface Functor<F extends URIS> {
  map<A, B>(fa: Kind<F, A>, f: (a: A) => B): Kind<F, B>;
}

Pikatarkistus

Testatkaa ymmärryksenne kevyestä HKT-mallista.

Kertaus

Kokositte kevyen HKT-mallin.

  • Defunktionalisointi korvaa tyyppifunktion soveltamisen haulla.
  • Kind<F, A> ratkaisee URIn ja argumentin konkreettiseksi tyypiksi.
  • Yleisissä allekirjoituksissa käytetään Kind-tyyppiä muodon F<A> sijaan.
  • Malli skaalautuu kahteen argumenttiin Kind2-tyypin avulla ja noudattaa fp-ts:n käytäntöä.

Seuraavaksi toteutetaan yleinen map oikeilla instansseilla.

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 ”Kevyt HKT-malli” ilmainen?

Kyllä – oppitunnin ”Kevyt HKT-malli” 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 ”Kevyt HKT-malli”?

Toteuttakaa Kind/URI-defunktionalisointitemppu. 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 3/4.

Kuinka kauan ”Kevyt HKT-malli”-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. HKT-ongelma TypeScriptissä
  2. Tyyppikonstruktoreiden määrittely
  3. Kevyt HKT-malli
  4. Geneeriset funktorit ja mappaajat
← Takaisin: TypeScript Academy