TypeScript Academy · Pelajaran

Corak HKT Ringan

Laksanakan helah penyahfungsian Kind/URI.

Pelajaran 3 daripada 413 langkah

Corak HKT Ringan ialah pelajaran TypeScript Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran TypeScript Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.

Penyahfungsian

Helah di sebalik pengekodan ini mempunyai nama: penyahfungsian. Daripada menggunakan fungsi jenis tertib tinggi sebenar, kita mewakili setiap fungsi dengan teg dan menyelesaikannya menggunakan satu carian tertib pertama. Daftar URItoKind ialah jadual carian tersebut.

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

Jenis Kind

Kind<F, A> ialah wajah awam corak ini. Fahaminya sebagai "konstruktor F diterapkan pada A". Ia menyembunyikan pengindeksan daftar di sebalik nama yang kemas.

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

Mengehadkan F kepada URIS

F mestilah URI yang didaftarkan. Hadkannya dengan extends URIS supaya hanya teg yang sah boleh digunakan dan kesilapan ejaan menjadi ralat kompilasi.

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

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

Menulis Tandatangan Generik

Kini kita boleh menulis tandatangan Functor yang sebelum ini mustahil. Gantikan setiap F<A> dengan Kind<F, A> dan pengompil akan menerimanya.

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

Penyelesaian dalam Tindakan

Apabila anda menetapkan F kepada URI konkrit, Kind diselesaikan kepada jenis bekas sebenar. Functor<"Array"> mempunyai map daripada A[] kepada B[].

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

Berbilang Argumen Jenis

Sesetengah konstruktor menerima dua argumen, seperti Either<E, A>. fp-ts melanjutkan corak ini dengan URItoKind2 dan Kind2<F, E, A> untuk kind * -> * -> *. Idea ini boleh diperluas dengan menambahkan lebih banyak daftar.

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

Konvensyen fp-ts

fp-ts menetapkan konvensyen yang diikuti oleh keseluruhan kursus ini: satu rentetan URI bagi setiap jenis data, satu daftar URItoKind yang dilanjutkan melalui penggabungan pengisytiharan dan Kind untuk penyelesaian. Mengenalinya membolehkan anda membaca tandatangan jenis fp-ts dan Effect.

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

Satu Rekod Instans

Satu "instans" abstraksi ialah nilai yang melaksanakannya untuk URI tertentu. Instans itu membawa map konkrit. Kita akan menulis instans Tatasusunan dalam pelajaran seterusnya; inilah bentuknya.

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

Mengapa Ini "Ringan"

Ia dipanggil corak HKT ringan kerana tidak memerlukan perubahan pengompil atau sintaks khas, hanya antara muka dan capaian berindeks. Kosnya ialah sedikit kerja tambahan (URI, daftar) sebagai pertukaran untuk kod yang benar-benar generik terhadap bekas.

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

Had

Corak ini agak panjang, dan mesej ralat boleh sukar ditafsir kerana menyebut pengekodan dan bukannya domain anda. Ia juga memerlukan setiap bekas didaftarkan. Bagi kebanyakan aplikasi, anda menggunakan pustaka yang sudah melakukannya dan bukannya membinanya sendiri.

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

Menggabungkan Semuanya

Resipi HKT ringan yang lengkap: takrifkan URI, daftarkannya dalam URItoKind, takrifkan abstraksi menggunakan Kind<F, A> dan sediakan instans bagi setiap URI. Itulah keseluruhan set alat di sebalik pustaka fungsian generik dalam TypeScript.

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>;
}

Semakan Ringkas

Uji pemahaman anda tentang corak HKT ringan.

Ulang Kaji

Anda telah menyusun corak HKT ringan.

  • Penyahfungsian menggantikan penerapan fungsi jenis dengan carian.
  • Kind<F, A> menyelesaikan URI bersama argumen kepada jenis konkrit.
  • Tandatangan generik menggunakan Kind dan bukannya F<A>.
  • Ia boleh dikembangkan kepada dua argumen melalui Kind2 dan merupakan konvensyen fp-ts.

Seterusnya: map generik dengan instans sebenar.

Percuma untuk bermula

Pelajari TypeScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
101
Pelajaran
352

Soalan Lazim

Adakah pelajaran “Corak HKT Ringan” percuma?

Ya — teks penuh “Corak HKT Ringan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus TypeScript Academy, tingkat taraf kepada CoddyKit PRO. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Corak HKT Ringan”?

Laksanakan helah penyahfungsian Kind/URI. Anda berlatih TypeScript Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan TypeScript Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran TypeScript Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Corak HKT Ringan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Masalah HKT dalam TypeScript
  2. Menentukan Pembina Jenis
  3. Corak HKT Ringan
  4. Functor dan Pemetaan Generik
← Kembali ke TypeScript Academy