Jalur Haskell memandu pembelajaran bahasa pemrograman fungsional murni dari fondasi sampai pengerjaan proyek nyata. Pembahasan dimulai dari ekspresi dan tipe, berlanjut ke tipe data aljabar, laziness, dan IO, kemudian mencapai type class Functor, Applicative, dan Monad, rekayasa berbasis tipe, serta perkakas build. Seluruh contoh ditargetkan pada GHC 9.14 LTS yang dipasang melalui GHCup, dan setiap konsep dibuktikan dengan kode yang dapat dijalankan. Sebelum memulai, GHC, Cabal, dan terminal disiapkan sesuai ketentuan pada modul pertama.
Haskell
Jalur pemrograman fungsional Haskell dari fondasi tipe murni sampai membangun, menguji, dan mengukur perangkat lunak nyata.
0/0 selesai
Modul pembuka: karakter bahasa Haskell, penyiapan toolchain, dan pembiasan GHCi.
- Apa itu Haskell?Karakter inti Haskell: fungsi murni, data immutable, evaluasi lazy, dan tipe statis kuat, beserta ranah di mana bahasa ini layak digunakan.
- PenyiapanMemasang GHC 9.14 LTS melalui GHCup, menyiapkan Cabal, dan mengonfigurasi editor dengan HLS.
- GHCi sebagai arena bermainEvaluasi ekspresi, penelusuran tipe dengan :t, dan perintah-perintah dasar GHCi.
Konstruksi inti bahasa Haskell: ekspresi, definisi, fungsi, pola, dan struktur data dasar.
- Ekspresi dan definisiModel segala sesuatu adalah ekspresi, penulisan definisi, serta perbandingan where dan let.
- FungsiPersamaan berganda untuk fungsi dengan beberapa kasus, aplikasi fungsi, dan operator pipe.
- Pattern matchingPencocokan pola pada argumen fungsi dan binding beserta penggunaan wildcard.
- Guard dan ifPercabangan ala Haskell dengan guard dan ekspresi if-then-else.
- List, tuple, dan rangeStruktur data inti Haskell yang digunakan sejak hari pertama: list homogen dan tuple.
Sistem tipe sebagai dokumen desain: membaca tipe, currying, polimorfisme, dan type class.
- Membaca tipeMembaca panah fungsi, aplikasi, dan disiplin :t sebagai dokumen desain.
- Currying dan aplikasi parsialMengapa setiap fungsi menerima satu argumen dan manfaat aplikasi parsial.
- PolimorfismeVariabel tipe dan penulisan fungsi generik yang bekerja untuk banyak tipe.
- Type classEq, Ord, Show, dan Enum sebagai perilaku yang menyertai constraint.
- Instans dan derivingMenulis instans type class secara manual dan menghasilkannya dengan deriving.
Membangun tipe data sendiri: data sum dan product, tipe rekursif, record, Maybe, Either, dan newtype.
- Deklarasi dataTipe sum dan product beserta penulisan konstruktornya.
- Tipe rekursifMembangun list dan tree sendiri beserta perilaku rekursif keduanya.
- RecordAksesor field dan jebakan sintaksis record yang perlu diwaspadai.
- Maybe dan EitherKegagalan sebagai data, bukan exception: Maybe untuk kasus kosong dan Either untuk pesan error.
- newtypeWrapper tanpa biaya pada waktu berjalan untuk keamanan tipe.
Fungsi orde tinggi sebagai pola kerja harian: map, filter, fold, komposisi, lambda, dan section.
- map dan filterDua fungsi orde tinggi keseharian untuk memetakan dan menyaring list.
- foldr dan foldlKonsumsi struktur sebagai pola umum beserta perbedaan foldr dan foldl.
- Komposisi dan gaya point-freeRantai komposisi (.) dan saat gaya point-free benar-benar memperjelas kode.
- Lambda dan sectionFungsi anonim dan section operator untuk fungsi pendek satu ekspresi.
Model evaluasi Haskell: call-by-need, struktur data tak hingga, dan jebakan space leak.
- Call-by-needThunk, sharing, dan urutan evaluasi pada model call-by-need.
- Struktur tak hinggaRange, siklus, dan algoritme pada stream tak hingga.
- Space leakBug akumulasi thunk klasik dan cara mendiagnosisnya.
Batas sistem yang jujur: tipe IO, notasi do, aksi dasar, kombinator, dan lingkungan program.
- Tipe IONilai yang mendeskripsikan interaksi dengan dunia luar dan kemurnian yang tetap terjaga.
- Notasi doSequencing aksi IO dan bentuk ter-desugarnya, bind.
- Aksi dasarputStrLn, getLine, readFile, dan writeFile untuk interaksi terminal dan berkas.
- KombinatormapM, forM, sequence, dan traverse untuk menyusun banyak aksi.
- LingkunganArgumen command line, variabel lingkungan, dan exit code program.
Generalisasi pola yang telah dipahami: hierarki type class dari Functor sampai Monad.
- HierarkiFunctor, Applicative, dan Monad sebagai kekuatan yang bertambah bertahap.
- Instans FunctorMapping atas Maybe, list, dan IO dengan fmap.
- Gaya Applicativepure, <$>, dan <*> untuk nilai yang membawa konteks.
- Monad dan bindPenyambungan langkah berkonteks melalui operator bind (>>=).
- Monad yang lazimMaybe, Either, list, dan IO tanpa mistisisme.
Tipe sebagai alat rekayasa: smart constructor, phantom type, QuickCheck, dan unit test.
- Merancang dengan tipeSmart constructor dan data tervalidasi di batas sistem.
- Phantom typeSekadar pengenalan: tipe yang memberi batasan saat kompilasi tanpa biaya.
- QuickCheckProperti, generator, dan shrinking pada pengujian berbasis properti.
- Unit testtasty dan HUnit untuk kasus yang terlewat oleh properti.
Mengorganisasi proyek: sistem modul, Cabal, Stack, dan perkakas pengalaman pengembang.
- Sistem modulEkspor, impor, dan nama qualified untuk memecah program.
- Proyek CabalBerkas .cabal, dependensi, executable dan library.
- Stack dan alternatifnyaMengenal alur kerja lainnya di luar Cabal.
- Pengalaman pengembangHLS, pemformatan kode, hlint, dan debugger GHC 9.14.
Biaya di balik keanggunan: big-O pada bahasa lazy, strictness, dan profiling.
- Big-O dalam bahasa lazyModel biaya yang mengejutkan naluri imperatif.
- Strictnessseq, bang pattern, dan data strict.
- ProfilingCost centre, profil heap, dan penafsiran laporannya.
Pustaka kode nyata: peta ekosistem, Text dan container, konkurensi async, serta JSON.
- Peta ekosistemMana yang dipelihara dan mana yang dapat dipercaya.
- Text dan containerPustaka yang digunakan kode nyata sebagai pengganti list.
- Konkurensi dengan asyncThread ringan untuk pekerjaan yang terikat IO.
- Serialisasi dan JSONRound-trip aeson dan API berbasis tipe.
Proyek terpandu: pemilihan proyek, perancangan tipe lebih dahulu, dan pembangunan bertahap dengan titik pemeriksaan.
- Pemilihan proyekAlat CLI, inti interpreter, atau layanan API JSON.
- Rancang tipe terlebih dahuluSignatur modul sebelum implementasi apa pun.
- Bangun dengan titik pemeriksaanProperti, pengujian, dan benchmark di setiap langkah.