Mengapa Haskell?
(gtf.io)-
"Tidak praktis", "akademis", "terlalu niche"
- Itulah reaksi orang-orang ketika mengetahui bahwa bahasa pemrograman favorit saya adalah Haskell
- Saya menggunakannya bukan hanya untuk proyek hobi, tetapi juga untuk membangun web server sungguhan
- Saya memimpin tim-tim di Converge yang bekerja dengan Haskell
-
Kesalahpahaman tentang Haskell
- Masalah yang bisa diselesaikan dengan bahasa pemrograman serbaguna juga bisa diselesaikan dengan bahasa lain
- Banyak fitur yang diperkenalkan di Python, Rust, Typescript, dan lainnya terinspirasi oleh Haskell atau telah diimplementasikan lebih kokoh di Haskell
- Ini tampak seperti variasi dari ideologi "pilih teknologi yang membosankan"
- Ada anggapan keliru bahwa pemrograman bukan matematika, sehingga unsur matematis harus disingkirkan
-
Tujuan tulisan ini
- Menjelaskan secara logis mengapa Haskell adalah pilihan terbaik bagi sebagian besar programmer
- Sangat berguna terutama bagi mereka yang ingin menulis software yang kokoh secara produktif
- Juga menekankan sisi menyenangkan dari menulis software
-
Unlearning dan relearning
- Sebagian besar programmer terbiasa dengan paradigma imperatif
- Haskell adalah bahasa fungsional murni dengan kurva belajar yang curam
- Bahasa Haskell sendiri cukup mudah dipelajari jika dibatasi pada subset sederhana
- Pemrograman fungsional menuntut perubahan total dalam cara menyusun program
- Proses ini membantu Anda berkembang sebagai programmer
- Kutipan Alan Perlis:
Bahasa yang tidak memengaruhi cara Anda berpikir tentang pemrograman tidak layak dipelajari.
Penjelasan singkat tentang sintaks
-
::menunjukkan type signature (contoh:myThing :: String) -
Pemanggilan fungsi tidak memakai tanda kurung; argumen ditulis setelah nama fungsi dan dipisahkan spasi (contoh:
doSomething withThis withThat) -
Dalam type signature, huruf kecil adalah type variable dan mewakili tipe arbitrer (contoh:
head :: [a] -> a) -
Ada dua jenis panah,
->dan=>:->menjelaskan tipe sebuah fungsi (contoh:add1 :: Int -> Int)=>menjelaskan constraint pada type variable dan selalu muncul lebih dulu (contoh:add1 :: Num a => a -> a)
-
Komentar diawali dengan
-- -
returnadalah fungsi biasa, bukan seperti makna yang biasanya dibayangkan -
doadalah syntactic sugar yang membuatnya tampak seperti gaya imperatif -
Ada beberapa cara untuk memberi nilai pada variabel lokal:
let x = <something> in <expression>atau
x <- <something> -
Mengurangi kesalahan
- Di banyak bahasa, orang menulis banyak test case agar kode menjadi "benar"
- Haskell sangat mengurangi beban ini melalui type system dan pemrograman fungsional murni
- Type system Haskell yang kuat memberikan jaminan konkret tentang program dan menegakkannya dengan ketat
- Ciri-ciri type system:
- Tidak ada nullable type
- Dapat mengekspresikan komputasi yang bisa gagal
- Pattern matching dan pemeriksaan kelengkapan
- Menghindari primitive obsession secara cuma-cuma
-
Manfaat tidak adanya nilai null
- Karena tidak ada nilai
null, Anda selalu tahu apakah sebuah nilai sesuai dengan tipe yang diharapkan - Ini mencegah error saat runtime dan mengurangi permukaan error
- Karena tidak ada nilai
-
Mengekspresikan komputasi yang bisa gagal
- Menggunakan tipe
MaybedanEitheruntuk secara eksplisit menyatakan komputasi yang dapat gagal Maybemerepresentasikan komputasi yang mungkin punya hasil atau mungkin tidaksafeHead :: [a] -> Maybe aEitherdapat memiliki dua nilai (Left aatauRight b)validateAddress :: String -> Either AddressParseError ValidAddress
- Menggunakan tipe
-
Pattern matching dan pemeriksaan kelengkapan
- Seluruh domain input harus ditangani; jika tidak, compiler akan memunculkan error
- Ini mencegah runtime error dan meningkatkan keandalan program
-
Menghindari primitive obsession
- Dengan
newtype, Anda dapat dengan mudah membuat tipe yang secara semantik lebih bermakna
newtype VenueName = VenueName String newtype EventName = EventName String - Dengan
-
Keunggulan pemrograman fungsional murni
- Data bersifat immutable, sehingga tidak perlu khawatir tentang mutasi state
- Side effect ditangani secara eksplisit, dan fungsi hanya bergantung pada input tanpa side effect
- Ini meningkatkan prediktabilitas dan stabilitas program
-
Penanganan side effect secara eksplisit
- Menggunakan monad
IOuntuk memisahkan dan mengendalikan side effect dalam kode - Dari type signature fungsi, kita bisa tahu bahwa fungsi tersebut menimbulkan side effect
sendGreetings :: User -> IO Response - Menggunakan monad
-
Monad dan kontrol efek
- Menggunakan typeclass dan monad untuk mengenkode secara tepat efek yang dapat dijalankan oleh suatu fungsi
- Ini mencegah side effect yang tidak diinginkan dan meningkatkan stabilitas kode
-
Faktor peningkat produktivitas
- Karena type system yang kuat dan sifat fungsional murni, reuse kode dan generalisasi konsep menjadi lebih mudah
- Melalui konsep seperti
FunctordanMonoid, pola yang sama dapat diterapkan pada berbagai struktur data
fmap (+2) [1, 2, 3] -- [3, 4, 5] fmap (+2) (Just 2) -- Just 4 -
Refactoring tanpa rasa takut
- Karena compiler sangat ketat, risiko munculnya bug baru saat mengubah kode menjadi kecil
- Type system memungkinkan domain program diekspresikan secara akurat, sehingga Anda bisa mengubah kode dengan tenang
-
Meningkatkan pemahaman tentang program
- Dengan pemrograman deklaratif, domain masalah dapat diekspresikan secara akurat
- Makna program lebih mudah dipahami dan keandalannya dapat ditingkatkan
- Dengan menghilangkan kompleksitas yang tidak perlu, penalaran yang masuk akal tentang program menjadi mungkin
-
Algebraic data type dan typeclass
- Bahasa khusus domain dapat dibangun di dalam Haskell
- Ini membantu dalam memahami dan memelihara program
-
Program contoh
- Menulis alat akuntansi sederhana untuk menerapkan konsep Haskell secara praktis
Epilog
- Menggunakan Haskell itu menyenangkan dan produktif
- Kombinasi antara type system yang kuat dan ekspresif dengan pemrograman fungsional murni membuat Haskell istimewa
- Bahasa lain juga mulai mengadopsi fitur-fitur ini, tetapi di Haskell karakteristik tersebut tertanam di fondasinya
- Mempelajari Haskell akan mengubah cara Anda berpikir tentang pemrograman
Pendapat GN⁺
-
Nilai belajar Haskell
- Membantu memperluas cara berpikir sebagai programmer
- Jika memahami paradigma pemrograman fungsional, Anda bisa menulis kode yang lebih baik bahkan di bahasa lain
-
Kebangkitan pemrograman fungsional
- Memiliki keunggulan dalam pemrosesan paralel dan konkurensi, sehingga cocok untuk lingkungan komputasi modern
- Karena side effect dikendalikan, penulisan kode yang dapat diprediksi menjadi mungkin
-
Perbandingan dengan bahasa lain
- Ada bahasa lain seperti Rust atau Scala yang mendukung pemrograman fungsional, tetapi kemurnian dan type system Haskell tetap unik
- Konsep-konsep Haskell dapat membantu saat mempelajari bahasa baru
-
Kemungkinan penerapan di dunia kerja
- Kurva belajar awal memang curam, tetapi produktivitas meningkat sebanding dengan waktu yang diinvestasikan
- Berguna untuk sistem kompleks atau domain yang sensitif terhadap error
-
Komunitas dan ekosistem
- Komunitas Haskell aktif, dan berbagai library serta tool terus dikembangkan
- Anda dapat meningkatkan kemampuan dengan berpartisipasi dalam proyek open source
3 komentar
Saya mulai belajar melalui F# yang dibekali dengan kepraktisan.
ADT dan pattern matching itu bagus, tapi tolong jangan terlalu sering membawa-bawa monad dan functor.
Komentar Hacker News
Haskell memaksa penulisan fungsi total alih-alih fungsi parsial
Sudah menggunakan Haskell selama 10 tahun dan alat-alatnya telah banyak membaik
Sistem tipe Haskell tidak membuktikan bahwa fungsi itu total
Bahasa Haskell bagus, tetapi ekosistemnya masih jauh dari matang
Ingin menggunakan Haskell atau bahasa fungsional lain secara profesional
Haskell sangat memengaruhi cara berpikir tentang pemrograman dan arsitektur kode
Haskell bereksperimen dengan lazy evaluation di tingkat bahasa
Kemurnian dan immutability Haskell yang ekstrem menjadi masalah
Haskell sangat cocok untuk perangkat lunak logika bisnis (BLOBS)