Neden Haskell?
(gtf.io)-
"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 -
returnnormal 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ı
nulldeğ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
MaybeveEithertipleri kullanılarak başarısız olabilecek hesaplamalar açık biçimde ifade edilirMaybe, bir sonucun var da olabileceği yok da olabileceği hesaplamaları gösterirsafeHead :: [a] -> Maybe aEitheriki tür değer taşıyabilir (Left aveyaRight 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
newtypeile 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ı
IOmonad'ı 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
FunctorveMonoidgibi 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
Ben, pratiklikle zenginleştirilmiş F# ile başladım
ADT ve pattern matching güzel ama lütfen monad ve functor muhabbeti çıkmasın.
Hacker News görüşü
Haskell, kısmi fonksiyonlar yerine toplam fonksiyonlar yazmayı zorlar
Haskell'i 10 yıldır kullanıyorum ve araçlar büyük ölçüde iyileşti
ghcup, cabal sandboxing ve HLS kararlıHaskell'in tip sistemi, fonksiyonların toplam olduğunu kanıtlamaz
Haskell dili iyi, ama ekosistemin hâlâ gidecek çok yolu var
Haskell'i ya da başka bir fonksiyonel dili profesyonel olarak kullanmak istiyorum
Haskell, programlama düşünce tarzım ve kod mimarim üzerinde büyük etki yaptı
Haskell, tembelliği dil seviyesinde deneyimliyor
Haskell'in aşırı saflığı ve değişmezliği sorunlu
Haskell, iş mantığı yazılımları (BLOBS) için çok uygun