Belajar Haskell - GHC 9.14.1 & Fitur Terbaru
Episode 20 of 23

Belajar Haskell - GHC 9.14.1 & Fitur Terbaru

Mengikuti perkembangan toolchain terkini: GHC 9.14.1 sebagai versi LTS pertama dengan dukungan minimal dua tahun, stabilisasi target wasm32wasi dan flag -fsimulate-foreign-errors, jalur rilis stabil 9.12.4, serta ekstensi bahasa seperti GADTs, TypeFamilies, DataKinds dan OverloadedStrings yang menggeser gaya menulis Haskell.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Sampai episode 19, semua kode kita berjalan di atas GHC 9.14.1 — dan belum kita tanya: apa sebenarnya yang baru di versi ini, dan mengapa tim memilihnya? Episode 20 ini menjawab pertanyaan itu, sekaligus mengenalkan ekstensi bahasa yang akan kalian temui di hampir semua proyek Haskell modern.

Mengapa bab ini penting? Karena versi GHC menentukan batas fitur bahasa yang bisa kalian pakai, kecepatan kompilasi, dan jangka waktu dukungan. Di produksi, memilih GHC LTS bukan soal "versi terbaru" — melainkan soal berapa lama tim mendapat patch keamanan tanpa dipaksa upgrade besar.

GHC 9.14.1: Rilis LTS Pertama

Pada 19 Desember 2025, GHC 9.14.1 dirilis dengan status bersejarah: ini adalah versi pertama berstatus LTS (Long Term Support). Artinya:

  • Dukungan minimal 2 tahun untuk patch dan fix penting — sebelumnya rilis GHC tidak punya jaminan durasi dukungan.
  • Baseline baru untuk ekosistem dependensi: paket di Hackage kini diasumsikan "memakai GHC 9.14+".
  • Masa tenang untuk upgrade: tim tidak lagi "dikejar" rilis baru setiap beberapa bulan.
Verifikasi versi
ghc --version

Harus mencetak The Glorious Glasgow Haskell Compilation System, version 9.14.1. Jika kalian masih di 9.8 atau lebih lama, inilah saatnya upgrade — alasan teknisnya di bawah.

Fitur Penting di 9.14

wasm32wasi Stabil

Target wasm32wasi — mengkompilasi Haskell ke WebAssembly — menjadi stabil di 9.14. Ini bukan eksperimen lagi: flag --target=wasm32wasi didukung sebagai target resmi, yang kita pakai di episode 18. Implikasi praktisnya besar: kode Haskell bisa dijadikan binary WASM untuk edge runtime dan browser dengan toolchain standar.

Target WASM stabil
ghc --target=wasm32wasi -O2 Main.hs -o app.wasm

-fsimulate-foreign-errors

Flag baru -fsimulate-foreign-errors membantu pengembangan FFI: alih-alih crash process saat error terjadi di kode foreign, GHC mensimulasikan error dan melempar exception Haskell yang bisa ditangkap. Ini membuat debugging interop (episode 18) jauh lebih nyaman:

Aktifkan simulasi error FFI
ghc -fsimulate-foreign-errors Main.hs

Perbaikan GHC API dan Compiler

9.14 membawa perbaikan signifikan pada GHC API (dipakai HLS dan tooling) dan internal compiler — hasilnya: HLS lebih stabil, error type checker lebih informatif, dan kompilasi lebih dapat diprediksi. Bagi kalian sebagai pengguna, efek yang paling terasa adalah editor experience yang lebih mulus dan error yang lebih mudah dibaca.

Jalur Rilis: Stabil, LTS, dan Legacy

Memahami peta rilis GHC membantu memilih versi untuk proyek:

JalurVersiStatus
LTS9.14.1 (19 Des 2025)Dukungan minimal 2 tahun — pilihan default
Stable9.12.4 (27 Mar 2026)Jalur stabil terkini
Legacy9.10.3, 9.8.4, 9.6.7Hanya untuk kompatibilitas lama

Aturan praktis 2026:

  • Proyek baru: 9.14.1 (LTS) — dukungan terpanjang, fitur terkini.
  • Konservatif/stabil: 9.12.4 — jalur stable yang sudah matang.
  • Legacy: hanya jika dependensi proyek belum mendukung versi lebih baru — dan segera rencanakan migrasi.

Tip

Selalu cek dukungan GHC di build-depends kalian. Sejak 9.14 menjadi baseline, beberapa paket mulai mencantumkan base >= 4.20 atau setara — jika error "cannot build" saat upgrade, biasanya ini alasannya, dan solusinya adalah meng-update dependensi ke versi yang mendukung baseline baru.

Ekstensi Bahasa: Di Atas Haskell 2010

Standar bahasa adalah Haskell 2010 — stabil dan konservatif. Inovasi hidup di ekstensi GHC yang diaktifkan per-file dengan pragma. Empat yang paling sering kalian jumpai:

GADTs: Tipe yang Lebih Presisi

GADTs (Generalized Algebraic Data Types) memungkinkan konstruktor menyandang tipe berbeda:

GADTs
{-# LANGUAGE GADTs #-}
 
data Expr a where
    Num  :: Int -> Expr Int
    Bool :: Bool -> Expr Bool
    Add  :: Expr Int -> Expr Int -> Expr Int

Sekarang Add hanya menerima Expr Int — compiler tahu bahwa Add (Bool True) (Num 1) mustahil. Tipe menjadi lebih presisi daripada ADT biasa.

TypeFamilies: Fungsi pada Level Tipe

TypeFamilies memetakan tipe ke tipe — "fungsi" yang berjalan di compile time:

TypeFamilies
{-# LANGUAGE TypeFamilies #-}
 
type family HasKey k where
    HasKey (k, v) = v
 
type instance HasKey (String, Int) = Int

Type families menjadi dasar dari banyak library modern — termasuk pilihan backend database di Persistent (episode 15).

DataKinds: Menjadi Tipe

DataKinds mengangkat nilai data menjadi tipe, membuka pintu pemrograman di level tipe:

DataKinds - nilai jadi tipe
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
 
data Ukuran = Kecil | Besar
 
data Kotak (s :: Ukuran) where
    KotakKecil :: Int -> Kotak 'Kecil
    KotakBesar :: Int -> Kotak 'Besar

'Kecil (dengan petik) adalah nilai Kecil yang diangkat menjadi tipe. Ini fondasi untuk API yang membedakan state pada level tipe — semakin dekat dengan "illegal states unrepresentable" dari episode 17.

OverloadedStrings: String Multi-Tipe

OverloadedStrings membuat literal string bisa menjadi String, Text, ByteString, atau tipe lain yang punya instance IsString:

OverloadedStrings
{-# LANGUAGE OverloadedStrings #-}
 
import Data.Text (Text)
 
pesan :: Text
pesan = "ini langsung bertipe Text"

Tanpa ekstensi ini, literal "..." selalu String dan harus dikonversi manual. Hampir semua proyek modern mengaktifkannya (kalian sudah melihatnya di episode 13).

Mengelola Ekstensi di cabal

Daripada menaruh pragma di tiap file, deklarasi ekstensi global di file .cabal (atau default-extensions di proyek) menjaga konsistensi:

default-extensions di .cabal
library
  hs-source-dirs:   src
  exposed-modules:  MyApp
  build-depends:    base
  default-extensions:
    OverloadedStrings
    DataKinds
    GADTs

Warning

Ekstensi adalah pedang bermata dua: OverloadedStrings dan DataKinds aman dan banyak dipakai, tetapi ekstensi agresif seperti FlexibleInstances yang tidak perlu bisa membuat kode tidak terbaca dan sulit dimigrasi. Aktifkan hanya yang dibutuhkan — tahan godaan meng-copy daftar ekstensi dari template besar.

Kesalahan Umum (Common Pitfalls)

  1. Upgrade GHC tanpa upgrade dependensi — paket lama belum mendukung baseline baru; periksa build-depends lebih dulu.
  2. Memakai fitur 9.14 di proyek yang dipatok 9.8 — baca versi GHC proyek sebelum memakai ekstensi/fitur baru.
  3. Lupa pragma ekstensi — "parse error on input ..." sering berarti pragma {-# LANGUAGE X #-} hilang di file.
  4. Ekstensi global yang tidak perlu — batasi default-extensions pada yang benar-benar dipakai semua modul.
  5. Tidak memanfaatkan LTS — jika tidak ada alasan kuat, pilih 9.14.1 untuk dukungan panjang.

Penutup

Inti yang harus dibawa pulang:

  • GHC 9.14.1 (19 Des 2025) adalah rilis LTS pertama dengan dukungan minimal 2 tahun.
  • Fitur penting: wasm32wasi stabil, -fsimulate-foreign-errors, perbaikan GHC API/compiler.
  • Jalur rilis: 9.14.1 (LTS, default), 9.12.4 (stable), 9.10.3/9.8.4/9.6.7 (legacy).
  • Ekstensi kunci: GADTs, TypeFamilies, DataKinds, OverloadedStrings — deklarasi di .cabal via default-extensions.
  • Aktifkan ekstensi seminimal mungkin, dan cek dukungan dependensi saat upgrade GHC.

Di episode 21 selanjutnya kita akan membahas performance & optimization — strictness analysis dan unlifted types, menghindari space leak dari akumulasi lazy, profiling dengan cabal build --enable-profiling dan +RTS -p, heap profile untuk menemukan kebocoran memori, serta benchmark dengan Criterion. Sampai jumpa di episode 21!