0Pricing
TypeScript Academy · Pelajaran

Functor dan Mapper Generik

Tulis fungsi map yang generik untuk kontainer apa pun.

Functor dan Mapper Generik adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 4 pelajaran total.

Functor Generik

Sekarang kita menggunakan pengodean ini sesuai tujuannya: map generik yang bekerja pada setiap wadah terdaftar. Antarmuka Functor, yang diparameterkan oleh URI, mendeklarasikan satu metode.

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

Instans Array

Sebuah instans mengimplementasikan map untuk satu URI. Instans Array melakukan pemetaan menggunakan metode larik bawaan. Kind<"Array", A>-nya diselesaikan menjadi A[].

const arrayFunctor: Functor<"Array"> = {
  URI: "Array",
  map: (fa, f) => fa.map(f)
};

Menggunakan Instans Array

Memanggil map pada instans Array mengubah setiap elemen sekaligus mempertahankan tipe wadah larik.

const doubled = arrayFunctor.map([1, 2, 3], n => n * 2);
// doubled: number[] -> [2, 4, 6]

Tipe Opsi

Definisikan opsi sebagai nilai atau null, lalu daftarkan. map-nya menerapkan fungsi hanya ketika nilai tersedia; jika tidak, null diteruskan.

interface URItoKind<A> { Option: A | null }
type Option<A> = A | null;

Instans Opsi

Instans opsi mempertahankan wadah opsi: fungsi diterapkan melalui nilai, sedangkan null tetap menjadi null.

const optionFunctor: Functor<"Option"> = {
  URI: "Option",
  map: (fa, f) => (fa === null ? null : f(fa))
};

Menggunakan Instans Opsi

Bentuk map yang sama sekarang bekerja pada wadah yang sepenuhnya berbeda. Nilai yang tersedia diubah; nilai yang tidak ada dibiarkan.

const a = optionFunctor.map(5, n => n + 1);    // 6
const b = optionFunctor.map(null, n => n + 1); // null

Satu Abstraksi, Banyak Wadah

Inilah manfaatnya. arrayFunctor dan optionFunctor menggunakan antarmuka Functor yang sama. Kode yang ditulis berdasarkan Functor<F> bekerja untuk keduanya tanpa perubahan.

function bumpAll<F extends URIS>(
  F: Functor<F>,
  fa: Kind<F, number>
): Kind<F, number> {
  return F.map(fa, n => n + 1);
}

Memanggil Fungsi Generik

bumpAll tidak mengetahui atau memedulikan wadah yang diterimanya. Berikan instans dan datanya; hasilnya mempertahankan tipe wadah.

const arr = bumpAll(arrayFunctor, [1, 2]); // number[] -> [2, 3]
const opt = bumpAll(optionFunctor, 9);     // number | null -> 10

Hukum Functor

Funktor yang benar mematuhi dua hukum: pemetaan fungsi identitas tidak mengubah apa pun, dan pemetaan dua fungsi secara berurutan sama dengan pemetaan komposisinya. Kedua instans larik dan opsi di atas memenuhi hukum tersebut.

// map(fa, x => x) === fa
// map(map(fa, f), g) === map(fa, x => g(f(x)))

Menambahkan Lebih Banyak Instans

Karena abstraksi ini terbuka, wadah baru dapat ditambahkan dengan mendaftarkan URI dan menyediakan instans. Pohon, hasil, atau tugas masing-masing dapat dipetakan oleh kode generik yang sama.

// Register URI, implement Functor<"Tree">,
// and bumpAll works on trees too - no edits to bumpAll

Mengapa Ini Penting

Funktor generik adalah pintu masuk ke abstraksi fungsional dalam TypeScript: aplikatif, monad, dan penelusuran. Masing-masing merupakan antarmuka atas Kind<F, A> dengan instans untuk setiap wadah. Sekarang Anda memahami mekanisme yang memungkinkan fp-ts dan Effect bekerja.

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

Pemeriksaan Singkat

Uji pemahaman Anda tentang funktor generik.

Ringkasan

Anda telah menulis map generik untuk wadah.

  • Functor<F> mendeklarasikan map atas Kind<F, A>.
  • Instans Array dan opsi mengimplementasikannya untuk URI masing-masing.
  • Kode generik seperti bumpAll bekerja untuk setiap wadah terdaftar.
  • Hukum funktor menjaga agar instans berperilaku baik; abstraksi yang lebih kaya dibangun di atasnya.

Berikutnya, Kursus 24: membangun pengurai yang aman terhadap tipe.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Functor dan Mapper Generik” gratis?

Ya — teks lengkap “Functor dan Mapper Generik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Functor dan Mapper Generik”?

Tulis fungsi map yang generik untuk kontainer apa pun. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Functor dan Mapper Generik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Masalah HKT dalam TypeScript
  2. Mendefinisikan Konstruktor Jenis
  3. Pola HKT Ringan
  4. Functor dan Mapper Generik
← Kembali ke TypeScript Academy