19 poin oleh GN⁺ 2024-09-13 | 3 komentar | Bagikan ke WhatsApp
  • "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 --

  • return adalah fungsi biasa, bukan seperti makna yang biasanya dibayangkan

  • do adalah 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
  • Mengekspresikan komputasi yang bisa gagal

    • Menggunakan tipe Maybe dan Either untuk secara eksplisit menyatakan komputasi yang dapat gagal
    • Maybe merepresentasikan komputasi yang mungkin punya hasil atau mungkin tidak
      safeHead :: [a] -> Maybe a  
      
    • Either dapat memiliki dua nilai (Left a atau Right b)
      validateAddress :: String -> Either AddressParseError ValidAddress  
      
  • 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  
    
  • 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 IO untuk memisahkan dan mengendalikan side effect dalam kode
    • Dari type signature fungsi, kita bisa tahu bahwa fungsi tersebut menimbulkan side effect
    sendGreetings :: User -> IO Response  
    
  • 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 Functor dan Monoid, 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

 
cosine20 2024-09-19

Saya mulai belajar melalui F# yang dibekali dengan kepraktisan.

 
savvykang 2024-09-13

ADT dan pattern matching itu bagus, tapi tolong jangan terlalu sering membawa-bawa monad dan functor.

 
GN⁺ 2024-09-13
Komentar Hacker News
  • Haskell memaksa penulisan fungsi total alih-alih fungsi parsial

    • Haskell tidak mencegah rekursi tak hingga
    • Dalam ekosistem FP yang bergerak ke tipe dependen, penting untuk memastikan type checker tidak berjalan tanpa henti
    • Banyak ekstensi ad-hoc di Haskell menimbulkan masalah
    • Jika menyukai filosofi Haskell, sebaiknya tidak membatasi diri hanya pada Haskell
    • Standardisasi Haskell telah gagal
    • Proposisi nilai unik GHC mungkin adalah sistem runtime GHC
  • Sudah menggunakan Haskell selama 10 tahun dan alat-alatnya telah banyak membaik

    • ghcup, cabal sandboxing, dan HLS stabil
    • Tidak banyak menemukan kekurangan dalam ekosistem library
    • Waktu kompilasi Haskell masih merepotkan
    • Waktu kompilasi dependensi menjadi panjang
  • Sistem tipe Haskell tidak membuktikan bahwa fungsi itu total

    • Dalam pemrograman umum, pembuktian totalitas tidak terlalu berguna
    • Kebanyakan orang memastikan program benar-benar bekerja lewat pengujian
  • Bahasa Haskell bagus, tetapi ekosistemnya masih jauh dari matang

    • Kompilernya lambat
    • Kemampuan pelaporan error kurang baik
    • Error pertama menghentikan sisa proses kompilasi
    • Tooling masih tertinggal dibanding bahasa fungsional lain
    • Ekosistem library masih kurang
    • Ide-ide Haskell telah memengaruhi banyak bahasa lain
  • Ingin menggunakan Haskell atau bahasa fungsional lain secara profesional

    • Bahasa seperti Go mudah dipelajari
    • Ingin belajar cara membangun codebase dalam bahasa fungsional
  • Haskell sangat memengaruhi cara berpikir tentang pemrograman dan arsitektur kode

    • Sistem tipe Haskell sangat kuat dan mudah dipahami
    • Mengoptimalkan kode Haskell secara mikro terasa menyenangkan
    • Tooling masih kurang
  • Haskell bereksperimen dengan lazy evaluation di tingkat bahasa

    • Lazy evaluation bisa diperoleh di tingkat standard library
  • Kemurnian dan immutability Haskell yang ekstrem menjadi masalah

    • Banyak programmer merasa loop prosedural/mutabel lebih mudah diekspresikan
    • Rust memakai sistem tipe yang mumpuni dan banyak idiom fungsional, tetapi tetap memungkinkan penggunaan loop dan mutabilitas
  • Haskell sangat cocok untuk perangkat lunak logika bisnis (BLOBS)

    • Sebagian besar logika bisnis dapat dimodelkan dengan tipe sederhana dan pattern matching
    • Jika menjaga bagian-bagian tetap sederhana, ini mudah diajarkan bahkan kepada kontributor nonteknis
    • Haskell itu menyenangkan