Bu beni Haskell'i öğrenmeye ikna eden örnek (ve oğlum öğrendiğime memnunum).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
Tamam, bu kısa, okunabilir bir program. Bu anlamda bir C programından daha iyidir. Fakat bunun, çok benzer bir yapıya sahip bir Python programından (diyelim ki) farkı nedir?
Cevap tembel bir değerlendirmedir. Çoğu dilde (hatta bazı işlevsel olanlarda), yukarıdaki gibi yapılandırılmış bir program, tüm dosyanın belleğe yüklenmesine ve ardından yeni bir adla yeniden yazılmasına neden olur.
Haskell "tembeldir". Bir şeyleri ihtiyacı olana kadar hesaplamaz ve dolayısıyla asla ihtiyaç duymadığı şeyleri hesaplamaz. Örneğin, writeFile
satırı kaldırırsanız , Haskell ilk başta dosyadan herhangi bir şey okumakla uğraşmazdı.
Olduğu gibi, Haskell bu veri yolunu optimize edebiliyor ve buna writeFile
bağlı olduğunu fark ediyor readFile
.
Sonuçlar derleyiciye bağlı olsa da, yukarıdaki programı çalıştırdığınızda tipik olarak şudur: program ilk dosyanın bir bloğunu (diyelim ki 8KB), ardından ikinci dosyaya yazar, ardından ilkinden başka bir bloğu okur. dosya ve ikinci dosyaya yazar vb. ( strace
Üzerinde koşmayı deneyin !)
... bu, bir dosya kopyasının verimli C uygulamasının yapacağı şeye çok benziyor.
Dolayısıyla Haskell, genellikle çok fazla performanstan ödün vermeden kompakt, okunabilir programlar yazmanıza izin verir.
Eklemem gereken başka bir şey de Haskell'in hatalı programlar yazmayı zorlaştırmasıdır. Şaşırtıcı tip sistemi, yan etkilerin olmaması ve elbette Haskell kodunun kompaktlığı, en az üç nedenden dolayı hataları azaltır:
Daha iyi program tasarımı. Azaltılmış karmaşıklık, daha az mantık hatasına yol açar.
Kompakt kod. Hataların var olması için daha az satır.
Hataları derleyin. Pek çok böcek sadece geçerli Haskell değil .
Haskell herkes için değil. Ama herkes denemeli.