29 Şubat 2012 Çarşamba

Haskell'e giriş

Haskell fonksiyonel bir programlama dilidir.Fonksiyonel programlama dilleri bazı durumlarda çok pratik olabilirler ancak piyasada fazla kullanılmazlar.Ancak bir programcı fonksiyonel programlama dillerinden aldığı zevki ve deneyimi başka yerde bulamaz diye düşünüyorum.
Piyasada kullanılmaz desem de işte bir mario oyunundaki kullanımı :
,

Öncelikle sadece Haskell için değil bütün programlama dillerinde program yazabilmemiz için ihtiyacımız olan en temel 2 şey vardır : metin düzenleyici ve derleyiciler(compiler).Ben Notepad++ 'ı kullanıyorum metin düzenleyici olarak..Her programlama dilinin kendine has bir compiler'ı vardır.Haskell için olan compiler'ı (GHC)  Buradan indirebilirsiniz.
Haskell'in yüklenip yüklenmediğini terminali açıp 'ghci' komudunu yazarak öğrenebiliriz.Başarıyla prelude> komut beklemeye başladıysa herşey tamamdır.Hata alıyorsak bir daha yüklemeyi deneyebiliriz.
Windows 7'de terminali arama bölümüne cmd yazarak,Linux'da ise Accessories  başlığı altında bulabiliriz. 
Derleyicimizi şimdi test etmeye başlayabiliriz :

C:\Users\user>ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> 1+1
2
Prelude> 3*2
6
Prelude> true&&false

<interactive>:1:1: Not in scope: `true'

<interactive>:1:7: Not in scope: `false'
Prelude> True&&False
False
Prelude>
Gördüğümüz gibi başarılı bir girişin ardından normal işlemlerimizi compiler'a yaptırmaya başladık.1+1'i bize 2 olarak döndü sorun yok gibi gözüküyor.Ancak farkettiyseniz  true&&false 'da hata verdi.Çünkü :
Haskell'de fonksiyon ve değişken isimleri küçük ve büyük harfe duyarlıdır.Ayrıca bir fonksiyon ismi büyük harfle başlayamaz.
Fonksiyonları görmedik daha ama ön bilgi olarak kalsın :)
Haskell'de genel olarak fonksiyonlarımızı tanımlamak için .hs uzantılı dosyalara fonksiyonlarımızın taslağını yazarız.Mesela benim deneme.hs dosyamda şunlar var:
ikiyekatla x = x + x  
Demek oluyorki bizim fonksiyonumuz bir x alacak ve bu x'i ikiye katlayacak.Fonksiyon tanımlaması C ailesine göre değişik.Öncelikle parantez olayı yok fonksiyon tanımlarken.Sona noktalı virgül de yok.Fonksiyonun döneceği değeri eşitlediğimiz bir takım işlemler var.Eşitliğin sol tarafı girdiler sağ tarafı da fonksiyonun döndüğü değer diyebiliriz.Şimdi biz bu fonksiyonu deneme.hs'de yazdık.Ancak compiler'da nasıl bağlayacağız?:

Prelude> :l deneme
[1 of 1] Compiling Main             ( deneme.hs, interpreted )
Ok, modules loaded: Main.
*Main> ikiyekatla 2
                                                                                                             4
Görüldüğü üzere tanımladığımız fonksiyonun dosyasını compiler'a bağlamak için dosyanın .hs uzantısız haliyle :l nin yanına yazıyoruz.Eğer bir hata varsa bize söyler ,yoksa *Main> der ve bizden girdi bekler.Girdi olarak da ikiyekatla 2 dedim gördüğünüz gibi parantez yok tamamen serbest ve bize 4 döndü.Tabiiki dosyanın en yukarıda görüldüğü gibi user klasörünün içinde olması gerekiyor.Eğer değilse çıkın ve ghci yapmadan önce "cd dosyanın bulunduğu konumu yazın" mesela cd Desktop gibi.
Önceden de dediğimiz gibi fonksiyonların isimleri büyük harfle başlamaz ancak içinde ' karakteri olabilir.Haskell kendine özel bazı tanımlanmış fonksiyonlara sahiptir.mesela max 3 4 bize 4 döner.min 2 3 bize 2 döner.succ 2 bize 3 döner (yani bir sonraki sayı) böyle değişik kendiliğinden tanımlı fonksiyonlar var onları yeri geldiğinde söyleyeceğiz ancak burada da gördüğünüz üzere fonksiyona verilen girdilerde hiç parantez kullanmadık.Şimdi biraz daha genişletilmiş bir örneğe bakalım :
kucugukatla x y  = if x > y then x*x  else y*y 
deneme.hs dosyasına bunu yazdıktan sonra bu fonksiyonu okuması için terminale yeniden :l deneme yada :r yazacağız. Gördüğünüz gibi fonksiyonumuz iki tane girdi alıyor x ve y, x y'den büyükse x'i aksi takdirde y'yi ikiye katlıyor.burada if kullanımını da görmüş olduk.parantez olayı olmadığından bi alt satıra geçelim derdi de yok :)





 


Hiç yorum yok:

Yorum Gönder