19 puan yazan GN⁺ 2024-09-13 | 3 yorum | WhatsApp'ta paylaş
  • "Pratik değil", "akademik", "niş"

    • İnsanların en sevdiğim programlama dilinin Haskell olduğunu öğrendiğinde verdiği tepkiler bunlar
    • Onu yalnızca hobi projelerinde değil, gerçek web sunucuları kurmak için de kullanıyorum
    • Converge'de Haskell ile çalışan ekipleri yönetiyorum
  • Haskell hakkındaki yanlış anlamalar

    • Genel amaçlı bir programlama diliyle çözülebilen problemler diğer dillerde de çözülebilir
    • Python, Rust, Typescript gibi dillere eklenen birçok özellik ya Haskell'den ilham aldı ya da Haskell'de daha sağlam biçimde uygulanmıştı
    • Bu, "sıkıcı teknolojiyi seç" ideolojisinin bir türevi gibi görünüyor
    • Programlama matematik değildir ve matematiksel unsurların dışlanması gerektiğine dair yanlış bir düşünce vardır
  • Bu yazının amacı

    • Haskell'in neden çoğu programcı için en iyi seçim olduğunu mantıksal olarak açıklamaya çalışmak
    • Özellikle sağlam yazılımları üretken biçimde yazmak isteyenler için faydalı
    • Yazılım geliştirmenin eğlenceli yönünü de vurgulamak
  • Unlearning ve relearning

    • Çoğu programcı emirsel paradigmaya alışkındır
    • Haskell saf fonksiyonel bir dildir ve öğrenme eğrisi diktir
    • Haskell dilinin kendisi, basit bir alt kümeyle sınırlanırsa öğrenmesi kolaydır
    • Fonksiyonel programlama, programların nasıl kurulduğuna dair tam bir bakış açısı değişimi gerektirir
    • Bu süreç, bir programcı olarak gelişmenize yardımcı olur
    • Alan Perlis'ten alıntı:

      Programlama hakkındaki düşüncelerinizi etkilemeyen bir dil, öğrenmeye değmez.

Sözdizimine kısa bir giriş

  • :: bir type signature'ı gösterir (örn. myThing :: String)

  • Fonksiyon çağrısında parantez kullanılmaz; argümanlar fonksiyon adından sonra boşlukla ayrılarak yazılır (örn. doSomething withThis withThat)

  • Type signature içinde küçük harfler type variable'dır ve herhangi bir tipi ifade eder (örn. head :: [a] -> a)

  • İki tür ok vardır: -> ve =>

    • -> fonksiyonun tipini açıklar (örn. add1 :: Int -> Int)
    • => type variable üzerindeki kısıtları açıklar ve her zaman önce gelir (örn. add1 :: Num a => a -> a)
  • Yorumlar -- ile başlar

  • return normal bir fonksiyondur; beklediğiniz anlama gelmez

  • do, kodu emirselmiş gibi gösteren sözdizimsel şekerdir

  • Yerel değişkenlere değer atamanın çeşitli yolları vardır:

    let x = <something> in  
    <expression>  
    

    veya x <- <something>

  • Hataları azaltmak

    • Birçok dilde kodu "doğru" hale getirmek için çok sayıda test durumu yazılır
    • Haskell, type system'i ve saf fonksiyonel programlamasıyla bu yükü büyük ölçüde azaltır
    • Haskell'in güçlü type system'i, program hakkında somut güvenceler sağlar ve bunları sıkı biçimde uygular
    • Type system'in özellikleri:
      • Nullable type yoktur
      • Başarısız olabilecek hesaplamalar ifade edilebilir
      • Pattern matching ve exhaustiveness check
      • Primitive obsession'ı ekstra çaba olmadan önler
  • Null değerlerin olmamasının faydaları

    • null değeri olmadığı için bir değerin beklenen tipte olup olmadığını her zaman bilirsiniz
    • Runtime hatalarını önler ve hata yüzeyini azaltır
  • Başarısız olabilen hesaplamaların ifadesi

    • Maybe ve Either tipleri kullanılarak başarısız olabilecek hesaplamalar açık biçimde ifade edilir
    • Maybe, bir sonucun var da olabileceği yok da olabileceği hesaplamaları gösterir
      safeHead :: [a] -> Maybe a  
      
    • Either iki tür değer taşıyabilir (Left a veya Right b)
      validateAddress :: String -> Either AddressParseError ValidAddress  
      
  • Pattern matching ve exhaustiveness check

    • Tüm girdi alanı ele alınmalıdır; aksi halde derleyici hata verir
    • Bu, runtime hatalarını önler ve programın güvenilirliğini artırır
  • Primitive obsession'dan kaçınma

    • newtype ile anlamsal olarak daha anlamlı tipler kolayca oluşturulabilir
    newtype VenueName = VenueName String  
    newtype EventName = EventName String  
    
  • Saf fonksiyonel programlamanın avantajları

    • Veri değiştirilemezdir; durum mutasyonunu dert etmeniz gerekmez
    • Yan etkiler açık biçimde ele alınır; fonksiyonlar yan etki olmadan yalnızca girdilerine bağlıdır
    • Bu da programın öngörülebilirliğini ve kararlılığını artırır
  • Yan etkilerin açık biçimde ele alınması

    • IO monad'ı kullanılarak yan etkiler koddan ayrılır ve denetlenir
    • Bir fonksiyonun yan etki ürettiği, type signature'ından anlaşılabilir
    sendGreetings :: User -> IO Response  
    
  • Monad'lar ve effect control

    • Typeclass'lar ve monad'lar kullanılarak bir fonksiyonun gerçekleştirebileceği etkiler tam olarak encode edilir
    • Bu, istenmeyen yan etkileri önler ve kodun kararlılığını artırır
  • Üretkenliği artıran unsurlar

    • Güçlü type system ve saf fonksiyonel yapı sayesinde kod yeniden kullanımı ve kavramların genellenmesi kolaylaşır
    • Functor ve Monoid gibi kavramlar aracılığıyla aynı kalıplar farklı veri yapılarında uygulanabilir
    fmap (+2) [1, 2, 3] -- [3, 4, 5]  
    fmap (+2) (Just 2) -- Just 4  
    
  • Korkusuz refactoring

    • Derleyicinin katılığı sayesinde kod değiştirirken yeni hata üretme riski daha düşüktür
    • Type system, program alanını doğru biçimde ifade etmenizi sağladığı için kodu güvenle değiştirebilirsiniz
  • Programı daha iyi anlamak

    • Deklaratif programlama ile problem alanı doğru biçimde ifade edilebilir
    • Programın anlamı daha kolay anlaşılır ve güvenilirliği artar
    • Gereksiz karmaşıklık ortadan kalktığı için program hakkında makul çıkarımlar yapmak mümkün olur
  • Cebirsel veri tipleri ve typeclass'lar

    • Haskell içinde alana özgü diller kurulabilir
    • Bu da programı anlamayı ve bakımını kolaylaştırır
  • Örnek program

    • Basit bir muhasebe aracı yazarak Haskell kavramlarını pratik biçimde uygular

Epilog

  • Haskell kullanmak keyifli ve üretkendir
  • Güçlü ve ifade gücü yüksek bir type system ile saf fonksiyonel programlamanın birleşimi Haskell'i özel kılar
  • Diğer diller de bu özellikleri benimsiyor, ancak Haskell'de bunlar temele yerleşmiştir
  • Haskell öğrenmek, programlama hakkındaki düşünme biçiminizi değiştirecektir

GN⁺ görüşü

  • Haskell'in öğrenme değeri

    • Bir programcı olarak düşünce ufkunuzu genişletmeye yardımcı olur
    • Fonksiyonel programlama paradigmasını anlamak, diğer dillerde de daha iyi kod yazmanızı sağlayabilir
  • Fonksiyonel programlamanın yükselişi

    • Paralel işleme ve eşzamanlılıkta güçlü olduğu için modern bilişim ortamlarına uygundur
    • Yan etkilerin kontrolü sayesinde öngörülebilir kod yazmak mümkündür
  • Diğer dillerle karşılaştırma

    • Rust veya Scala gibi fonksiyonel programlamayı destekleyen diller de var, ancak Haskell'in saflığı ve type system'i benzersizdir
    • Yeni bir dil öğrenirken Haskell'in kavramları yardımcı olabilir
  • İş ortamında uygulanabilirlik

    • İlk öğrenme eğrisi dik olsa da harcanan zaman kadar üretkenlik geri döner
    • Karmaşık sistemlerde veya hatalara duyarlı alanlarda faydalıdır
  • Topluluk ve ekosistem

    • Haskell topluluğu canlıdır; çeşitli kütüphaneler ve araçlar sürekli geliştirilmektedir
    • Açık kaynak projelere katılarak becerilerinizi geliştirebilirsiniz

3 yorum

 
cosine20 2024-09-19

Ben, pratiklikle zenginleştirilmiş F# ile başladım

 
savvykang 2024-09-13

ADT ve pattern matching güzel ama lütfen monad ve functor muhabbeti çıkmasın.

 
GN⁺ 2024-09-13
Hacker News görüşü
  • Haskell, kısmi fonksiyonlar yerine toplam fonksiyonlar yazmayı zorlar

    • Haskell sonsuz özyinelemeyi engellemez
    • Bağımlı tiplere yönelen FP ekosisteminde, tip denetleyicinin sonsuza kadar çalışmamasını sağlamak önemlidir
    • Haskell'deki birçok geçici genişletme sorun çıkarır
    • Haskell felsefesini seviyorsanız, kendinizi yalnızca Haskell ile sınırlamamalısınız
    • Haskell'in standardizasyonu başarısız oldu
    • GHC'nin kendine özgü değer önerisi, GHC çalışma zamanı sistemi olabilir
  • Haskell'i 10 yıldır kullanıyorum ve araçlar büyük ölçüde iyileşti

    • ghcup, cabal sandboxing ve HLS kararlı
    • Kütüphane ekosisteminde çok fazla eksik hissetmedim
    • Haskell'in derleme süreleri hâlâ can sıkıcı
    • Bağımlılıkların derlenmesi uzun sürüyor
  • Haskell'in tip sistemi, fonksiyonların toplam olduğunu kanıtlamaz

    • Genel programlamada toplamlık kanıtı pek yararlı değildir
    • Çoğu insan, programın gerçekten çalıştığını doğrulamak için testlere güvenir
  • Haskell dili iyi, ama ekosistemin hâlâ gidecek çok yolu var

    • Derleyici yavaş
    • Hata raporlama yeteneği zayıf
    • İlk hata, derlemenin geri kalanını durduruyor
    • Araçlar, diğer fonksiyonel dillere kıyasla hâlâ yetersiz
    • Kütüphane ekosistemi zayıf
    • Haskell'in fikirleri başka birçok dili etkiledi
  • Haskell'i ya da başka bir fonksiyonel dili profesyonel olarak kullanmak istiyorum

    • Go gibi dilleri öğrenmek kolaydı
    • Fonksiyonel dillerde bir kod tabanının nasıl kurulduğunu öğrenmek istiyorum
  • Haskell, programlama düşünce tarzım ve kod mimarim üzerinde büyük etki yaptı

    • Haskell'in tip sistemi çok güçlü ve anlaşılması kolay
    • Haskell kodunu mikro-optimize etmek eğlenceliydi
    • Araçlar hâlâ yetersiz
  • Haskell, tembelliği dil seviyesinde deneyimliyor

    • Tembellik, standart kütüphane seviyesinde elde edilebilir
  • Haskell'in aşırı saflığı ve değişmezliği sorunlu

    • Birçok programcı, prosedürel/değiştirilebilir döngüleri ifade etmeyi daha kolay buluyor
    • Rust, yetkin bir tip sistemi ve birçok fonksiyonel deyim kullanıyor, ama döngüler ve değiştirilebilirlik de sunuyor
  • Haskell, iş mantığı yazılımları (BLOBS) için çok uygun

    • Basit tipler ve pattern matching ile iş mantığının çoğu modellenebilir
    • Basit kısımlar korunursa, teknik olmayan katkı sunanlara bile kolayca öğretilebilir
    • Haskell eğlenceli