Menutup series dengan peta lengkap: membandingkan Haskell dengan Scala, Rust, Elm dan PureScript, kapan memilih bahasa yang mana, rekap seluruh perjalanan episode 0 sampai 21, checklist production readiness dari GHCup hingga CI, serta sumber belajar resmi untuk melanjutkan perjalanan functional programming.

Inilah episode terakhir series Belajar Haskell — dan seperti akhir perjalanan yang baik, kita melakukan tiga hal: melihat ke samping (di mana posisi Haskell di peta bahasa), melihat ke belakang (rekap seluruh materi), dan melihat ke depan (kapan dan bagaimana memakainya di dunia nyata).
Mengapa bab ini penting? Karena menguasai sebuah bahasa bukan berarti menggunakannya untuk segalanya. Keputusan memilih bahasa — Haskell untuk logika, Rust untuk sistem, Scala untuk JVM — adalah keputusan arsitektur yang berdampak bertahun-tahun. Setelah episode ini, kalian punya kerangka untuk membuat keputusan itu dengan percaya diri.
Keduanya membawa pemrograman fungsional ke level tinggi, tapi dari dunia yang berbeda:
| Aspek | Haskell | Scala |
|---|---|---|
| Paradigma | Purely functional | OOP + FP hybrid |
| Runtime | Native (GHC) | JVM |
| Laziness | Laziness by default | Strict (lazy opt-in via LazyList) |
| Tipe | Ekstrem (typeclass, GADT) | Kuat (traits, path-dependent) |
| Ekosistem | Compiler, blockchain, formal | Spark, big data, industri JVM |
Kapan memilih: Scala unggul ketika kalian sudah terikat ekosistem JVM — Spark, Hadoop, atau codebase Java yang butuh interop. Haskell unggul ketika correctness lebih penting daripada ekosistem, dan kalian tidak butuh JVM.
Rust mengadopsi banyak ide FP (immutability default, ADT, pattern matching) dengan fokus berbeda:
| Aspek | Haskell | Rust |
|---|---|---|
| Fokus | Correctness melalui tipe | Memory safety tanpa GC |
| Ownership | Tidak ada (GC) | Ownership + borrowing |
| Lazy | Ya | Tidak (eager) |
| Gaya | Deklaratif | Sistem + imperatif terkurung |
Kapan memilih: Rust untuk systems programming — kernel, embeded, browser — di mana kontrol memori dan tanpa GC adalah keharusan. Haskell untuk correctness-critical logic di mana kecepatan pengembangan dan keamanan logika lebih bernilai daripada kontrol memori manual.
Keduanya membawa FP murni ke frontend:
| Aspek | Haskell | Elm | PureScript |
|---|---|---|---|
| Target | Native/WASM | JavaScript | JavaScript |
| Gaya | Umum | Terkurasi, sederhana | Haskell-ish, ekspresif |
| Ekosistem | Backend dominan | Frontend | Frontend + backend (Node) |
Kapan memilih: Elm untuk UI yang sederhana dan harus stabil (arsitektur The Elm Architecture sangat terkurasi). PureScript untuk pengalaman Haskell penuh di browser. Dan sejak WASM stabil (episode 18), logika Haskell sendiri bisa langsung dijalankan di frontend.
Kerangka keputusan praktis:
| Kebutuhan | Pilihan terbaik |
|---|---|
| Kompiler, interpreter, DSL | Haskell — ADT + parser adalah rumahnya |
| Smart contract / blockchain | Haskell (Cardano) — correctness kritis |
| Protokol kripto, verifikasi | Haskell — tipe ekstrem membuktikan properti |
| Big data / Spark | Scala (JVM) |
| Systems / embedded / kernel | Rust |
| Frontend FP murni | Elm (sederhana) / PureScript (ekspresif) |
| Backend API umum di tim FP | Haskell (Servant/Yesod) |
Inti pertimbangannya selalu sama: di mana biaya kegagalan tertinggi, di situ correctness paling berharga. Jika error mahal (transaksi, smart contract, protokol), Haskell menawarkan jaminan paling kuat dengan usaha paling sedikit dibanding bahasa lain.
Tip
Haskell tidak harus "semua atau tidak sama sekali". Pola yang paling pragmatis di industri: tulis core logika di Haskell (pure, diuji QuickCheck), dan biarkan bahasa lain menangani hal yang bukan kekuatannya. foreign export (episode 18) atau microservice Servant adalah dua cara mengemas core itu agar bisa dipakai tim lain.
Rangkaian lengkap yang sudah kalian lewati:
Jika ada bab yang masih terasa berat, kembali lagi ke sana — setiap konsep saling membangun. Monad butuh typeclass, typeclass butuh ADT, ADT butuh pemahaman tipe.
Menyatukan semua materi, ini checklist sebelum aplikasi Haskell kalian siap produksi:
cabal.project, file .cabal, exposed-modules rapi (episode 9)Either + ExceptT untuk recoverable, bracket untuk resource (episode 16)Arbitrary (episode 10, 19)+RTS -s, heap profile untuk space leak (episode 21)cabal test --enable-coverage, -Wall -Werror (episode 19)cabal-audit di CI (episode 17)Untuk melanjutkan setelah series ini:
| Sumber | Alamat | Untuk |
|---|---|---|
| haskell.org | haskell.org | Platform, dokumentasi, berita |
| GHC releases | www.haskell.org/ghc | Rilis, manual, changelog |
| Hoogle | hoogle.haskell.org | Cari fungsi berdasarkan tipe |
| Hackage | hackage.haskell.org | Paket & dokumentasi library |
| Stackage | stackage.org | Snapshot LTS untuk stack |
| Learn You a Haskell | learnyouahaskell.com | Tutorial ramah pemula |
| Haskell Weekly | haskellweekly.news | Berita & artikel rutin |
Hoogle adalah alat yang paling layak dikuasai: cari fungsi berdasarkan tipe ((a -> b) -> [a] -> [b]) — kalian akan kagum betapa cepatnya menemukan fungsi yang sudah disediakan ekosistem.
Selama 23 episode, kalian telah menempuh perjalanan dari "apa itu Haskell" hingga aplikasi production-grade — GHCup dan arsitektur compiler, sintaks dan tipe, purity dan laziness, typeclass dan monad, concurrency dan STM, backend Servant, streaming, database, keamanan, FFI dan WASM, hingga performa dan profiling.
Inti yang harus dibawa pulang:
Semoga perjalanan ini memberi kalian alat berpikir yang tidak dimiliki banyak developer: kemampuan melihat kode sebagai ekspresi yang bisa dibuktikan, bukan sekadar instruksi yang dijalankan. Teruslah bereksperimen di GHCi, tulis properti sebelum menulis fungsi, dan jadikan compiler sebagai rekan kerja terbaik kalian. Sampai jumpa di series berikutnya — selamat berkarya dengan Haskell!