seferahsankaptiel
Centipat
- Katılım
- 16 Mayıs 2022
- Mesajlar
- 324
- Makaleler
- 3
Kaynak ==> Amazon
GİRİŞ
Bu kitabın ilk bölümlerini okurken, bazen fikirleri kısıtlı, basitleştirilmiş bir biçimde tanıtacağımızı unutmayın. Haskell derin bir dildir ve belirli bir konunun her yönünü bir kerede sunmak ezici olabilir. Haskell'de sağlam bir temel oluştururken, bu ilk açıklamaları genişleteceğiz.
HASKELL ORTAMINIZ
Haskell, ikisi yaygın olarak kullanılan birçok geliştirme ortamına sahip bir dildir. Hugs, öncelikle öğretmek için kullanılan bir yorumlayıcıdır. Gerçek uygulamalar için, Glasgow Haskell derleyicisi (GHC) çok daha popülerdir. Hugs ortamıyla karşılaştırıldığında, GHC “gerçek iş” için daha uygundur: yerleşik doğal koda derler, paralel yürütmeyi destekler ve yararlı performans analizi ve hata ayıklama araçları sağlar. Bu nedenlerden dolayı GHC, bu kitap boyunca kullanacağımız Haskell uygulaması ya da ortamıdır.
GHC'nin üç ana bileşeni vardır:
1- ghc ===> Hızlı yerel kod üreten bir optimize edici derleyici
2- ghci ===> Etkileşimli bir yorumlayıcı ve hata ayıklayıcı
3- runghc ===> Haskell programlarını önceden derlemeye gerek kalmadan komut dosyaları olarak çalıştırmayı sağlayan bir program
Peki GHC bileşenlerine nasıl atıfta bulunuyoruz: GHC sistemini bir bütün olarak tartıştığımızda, GHC olarak adlandıracağız. Fakat belirli bir komuttan bahsediyorsak, GHC, GHCI veya Runghc'den söz ediyor olacağız.
2007 yılında piyasaya sürülen GHC'nin en az 6.8.2 sürümünü kullandığınızı varsayıyoruz. Örneklerimizin çoğu eski sürümlerle mevcut kod düzenlenmeksizin çalışacaktır. Ancak, platformunuz için mevcut en yeni sürümü kullanmanızı öneririz. Windows veya Mac OS X kullanıyorsanız, önceden oluşturulmuş bir yükleyiciyi kullanarak kolayca ve hızlı bir şekilde başlayabilirsiniz. Bu platformlar için GHC'nin bir kopyasını elde etmek için GHC İndirme sayfasını ziyaret edin ve ikili paketler ve yükleyicilerin listesini arayın.
BSD ve diğer UNIX varyantlarının birçok Linux distribütörü ve sağlayıcısı, GHC'nin özel ikili paketlerini kullanılabilir hale getiriyor. Bunlar her ortam için özel olarak oluşturulduğundan, yüklenmesi ve kullanılması, GHC indirme sayfasında bulunan genel ikili paketlerden çok daha kolaydır. GHC sayfa dağıtım paketlerinde GHC üreten dağıtımların bir listesini bulabilirsiniz.
Ayrıca GHC'nin çeşitli popüler platformlara nasıl yükleneceği hakkında daha ayrıntılı bilgi için Ek A'da bazı talimatlar sunduk.
GHC YORUMLAYICISI İLE BAŞLAMAK
GHC için etkileşimli yorumlayıcı aslında GHCI adlı bir programdır. Haskell ifadelerini girip değerlendirmemizi, modülleri keşfetmemizi ve kodumuzda hata ayıklamamızı sağlar. Eğer Python veya Ruby'ye aşina iseniz, GHCI biraz Python ve IRB, etkilşimli Python ve Ruby yorumlayıcılarına benzerdir.
GHCI komutunun dar bir kapsamı vardır: Unix benzeri sistemlerde GHCI'yi kabuk penceresinde bir komut olarak çalıştırırız. Windows'ta, başlangıç menüsü üzerinden kullanılabilir. Örneğin, programı Windows XP'de GHC yükleyicisini kullanarak yüklerseniz, tüm programlara, ardından GHC'ye gitmelisiniz; Listede GHCI göreceksiniz. (Ekran görüntüsü için windows bölümüne bakın.)
GHCI çalıştırdığımızda, bir başlangıç notu, ardından bir " Prelude> " istemi görüntüler. Aşağıda, bir Linux cihazındaki 6.8.3 sürümünü görüyoruz:
$ ghci
GHCi, version 6.8.3: Home — The Glasgow Haskell Compiler :? for help
Loading package base ... linking ... done.
Prelude>
Konut istemindeki " Prelude " kelimesi, kullanışlı fonksiyonların standart bir kitaplığı durumunda olan Prelude'un yüklü ve kullanıma hazır olduğunu gösterir. Diğer modülleri veya kaynak dosyaları yüklediğimizde, onlar da komut isteminde görünecektir.
Yardım Almak: Eğer GHCI komut istemine " :? " kodunu girerseniz, uzun bir yardım mesajı yazdıracaktır.
Prelude modülü, içeriği Haskell 98 standardı tarafından tanımlandığı için, bazen “standart prelude” olarak da adlandırılır. Fakat basitçe ve genellikle, “Prelude” olarak kısaltılır.
GHCI Komut İstemi Hakkında: GHCI tarafından görüntülenen komut istemi, hangi modülleri yüklediğimize bağlı olarak sık sık değişir. Komut istemi genellikle girdimiz için tek bir satırda küçük bir sanal boş yer bırakacak kadar uzar.
Öz ve tutarlılık için, GHCI’nin bu kitaptaki varsayılan komut istemlerini "ghci> " adlı komut istemi dizesi ile değiştirdik.
Eğer bunu kendiniz yapmak istiyorsanız, GHCI’nin ": set" adlı konut istemini direktifini aşağıdaki gibi kullanın:
Prelude> :set prompt "ghci> "
ghci>
Prelude her zaman dolaylı olarak mevcuttur; tanımladığı türleri, değerleri veya fonksiyonları kullanmak için herhangi bir işlem yapmamız gerekmez. Diğer modüllerdeki tanımlamaları kullanmak için, bunları ":modul" komutunu kullanarak GHCI'ye yüklemeliyiz:
ghci> :module + Data.Ratio
Artık rasyonel sayılarla (kesirlerle) çalışmamızı sağlayan "Data.Ratio" modülünün işlevselliğini kullanabiliriz.
TEMEL ETKİLEŞİM: GHCI'Yİ HESAP MAKİNESİ OLARAK KULLANMAK
Kod parçalarını test etmek için uygun bir arayüz sağlamanın yanı sıra, GHCI kolayca erişilebilir bir masaüstü hesap makinesi olarak işlev görebilir. GHCI'da herhangi bir hesap makinesi işlemini kolayca ifade edebiliriz ve ek bir bonus olarak Haskell'e daha fazla aşina oldukça daha karmaşık işlemler de ekleyebiliriz. Hatta yorumlayıcıyı böyle basit bir şekilde kullanmak, Haskell'in nasıl çalıştığına dair bize yardımcı olabilir.
TEMEL ARİTMETİK
GHCI'nin onlarla ne yapacağını görmek için hemen ifadeleri girmeye başlayabiliriz. Temel aritmetik, C ve Python gibi dillere benzer şekilde çalışır - İfadeleri, aşağıdaki gibi, operatör ya da işleçin işlenen nesnelerin arasında göründüğü "infix" (yani işlenenlerin ortasına konan bir "ek") şeklinde yazıyoruz:
ghci> 2 + 2
4
ghci> 31337 * 101
3165037
ghci> 7.0 / 2.0
3.5
Bir ifadeyi " infix " şeklinde yazmak sadece bir kolaylıktan dolayıdır: ayrıca bir ifadeyi operatörün(+, -, *, / gibi), argümanlarından önce geldiği " prefix " yani ön-ek biçiminde de yazabiliriz. Fakat bunu yapmak için, söz konusu operatörü aşağıdaki gibi parantezler içerisine almalıyız:
ghci> 2 + 2 ( infix şeklinde )
4
ghci> (+) 2 2 ( prefix şeklinde )
4
Bu açıklamaların da ima ettiği gibi, Haskell'in tamsayılar ve kayan noktalı sayılar gibi kavramları vardır. Tamsayılar isteğe bağlı olarak büyük olabilir. Mesela burada, (^) operatörü o tamsayının üssünü ya da kuvvetini almayı sağlar:
ghci> 313 ^ 15
27112218957718876716220410905036741257
ARİTMETİK BİR TUHAFLIK: NEGATİF SAYILARI YAZMAK
Haskell bize sayıları nasıl yazmamız gerektiğine dair bir tuhaflık sunar: genelde negatif bir sayıyı parantez içinde göstermek gerekir. Bu, en basit ifadelerin ötesine geçer geçmez bizi etkiler.
Negatif bir sayı yazarak başlayacağız:
ghci> -3
-3
Yukarıdaki kodda kullanılan " - " işareti, tekli bir işleçtir. Diğer bir ifadeyle, aslında "-3" tek sayısını yazmadık; " 3 " sayısını yazdık ve ona " - " operatörünü uyguladık. Bu nedenle; " - " operatörü Haskell'in sadece tekli operatör ya da işlecidir ve onu infix operatörleri ya da işleçleriyle karıştırmamalıyız: (karıştırırsak ne mi olur)
ghci> 2 + -3
<interactive>:1:0:
precedence parsing error
cannot mix `(+)' [infixl 6] and prefix `-' [infixl 6] in the same infix expression
Eğer bir infix operatörünün yanında eksi işaretini kullanmak istiyorsak, o ifadeyi parantezlerle kapatmalıyız:
ghci> 2 + (-3)
-1
ghci> 3 + (-(13 * 37))
-478
GİRİŞ
Bu kitabın ilk bölümlerini okurken, bazen fikirleri kısıtlı, basitleştirilmiş bir biçimde tanıtacağımızı unutmayın. Haskell derin bir dildir ve belirli bir konunun her yönünü bir kerede sunmak ezici olabilir. Haskell'de sağlam bir temel oluştururken, bu ilk açıklamaları genişleteceğiz.
HASKELL ORTAMINIZ
Haskell, ikisi yaygın olarak kullanılan birçok geliştirme ortamına sahip bir dildir. Hugs, öncelikle öğretmek için kullanılan bir yorumlayıcıdır. Gerçek uygulamalar için, Glasgow Haskell derleyicisi (GHC) çok daha popülerdir. Hugs ortamıyla karşılaştırıldığında, GHC “gerçek iş” için daha uygundur: yerleşik doğal koda derler, paralel yürütmeyi destekler ve yararlı performans analizi ve hata ayıklama araçları sağlar. Bu nedenlerden dolayı GHC, bu kitap boyunca kullanacağımız Haskell uygulaması ya da ortamıdır.
GHC'nin üç ana bileşeni vardır:
1- ghc ===> Hızlı yerel kod üreten bir optimize edici derleyici
2- ghci ===> Etkileşimli bir yorumlayıcı ve hata ayıklayıcı
3- runghc ===> Haskell programlarını önceden derlemeye gerek kalmadan komut dosyaları olarak çalıştırmayı sağlayan bir program
Peki GHC bileşenlerine nasıl atıfta bulunuyoruz: GHC sistemini bir bütün olarak tartıştığımızda, GHC olarak adlandıracağız. Fakat belirli bir komuttan bahsediyorsak, GHC, GHCI veya Runghc'den söz ediyor olacağız.
2007 yılında piyasaya sürülen GHC'nin en az 6.8.2 sürümünü kullandığınızı varsayıyoruz. Örneklerimizin çoğu eski sürümlerle mevcut kod düzenlenmeksizin çalışacaktır. Ancak, platformunuz için mevcut en yeni sürümü kullanmanızı öneririz. Windows veya Mac OS X kullanıyorsanız, önceden oluşturulmuş bir yükleyiciyi kullanarak kolayca ve hızlı bir şekilde başlayabilirsiniz. Bu platformlar için GHC'nin bir kopyasını elde etmek için GHC İndirme sayfasını ziyaret edin ve ikili paketler ve yükleyicilerin listesini arayın.
BSD ve diğer UNIX varyantlarının birçok Linux distribütörü ve sağlayıcısı, GHC'nin özel ikili paketlerini kullanılabilir hale getiriyor. Bunlar her ortam için özel olarak oluşturulduğundan, yüklenmesi ve kullanılması, GHC indirme sayfasında bulunan genel ikili paketlerden çok daha kolaydır. GHC sayfa dağıtım paketlerinde GHC üreten dağıtımların bir listesini bulabilirsiniz.
Ayrıca GHC'nin çeşitli popüler platformlara nasıl yükleneceği hakkında daha ayrıntılı bilgi için Ek A'da bazı talimatlar sunduk.
GHC YORUMLAYICISI İLE BAŞLAMAK
GHC için etkileşimli yorumlayıcı aslında GHCI adlı bir programdır. Haskell ifadelerini girip değerlendirmemizi, modülleri keşfetmemizi ve kodumuzda hata ayıklamamızı sağlar. Eğer Python veya Ruby'ye aşina iseniz, GHCI biraz Python ve IRB, etkilşimli Python ve Ruby yorumlayıcılarına benzerdir.
GHCI komutunun dar bir kapsamı vardır: Unix benzeri sistemlerde GHCI'yi kabuk penceresinde bir komut olarak çalıştırırız. Windows'ta, başlangıç menüsü üzerinden kullanılabilir. Örneğin, programı Windows XP'de GHC yükleyicisini kullanarak yüklerseniz, tüm programlara, ardından GHC'ye gitmelisiniz; Listede GHCI göreceksiniz. (Ekran görüntüsü için windows bölümüne bakın.)
GHCI çalıştırdığımızda, bir başlangıç notu, ardından bir " Prelude> " istemi görüntüler. Aşağıda, bir Linux cihazındaki 6.8.3 sürümünü görüyoruz:
$ ghci
GHCi, version 6.8.3: Home — The Glasgow Haskell Compiler :? for help
Loading package base ... linking ... done.
Prelude>
Konut istemindeki " Prelude " kelimesi, kullanışlı fonksiyonların standart bir kitaplığı durumunda olan Prelude'un yüklü ve kullanıma hazır olduğunu gösterir. Diğer modülleri veya kaynak dosyaları yüklediğimizde, onlar da komut isteminde görünecektir.
Yardım Almak: Eğer GHCI komut istemine " :? " kodunu girerseniz, uzun bir yardım mesajı yazdıracaktır.
Prelude modülü, içeriği Haskell 98 standardı tarafından tanımlandığı için, bazen “standart prelude” olarak da adlandırılır. Fakat basitçe ve genellikle, “Prelude” olarak kısaltılır.
GHCI Komut İstemi Hakkında: GHCI tarafından görüntülenen komut istemi, hangi modülleri yüklediğimize bağlı olarak sık sık değişir. Komut istemi genellikle girdimiz için tek bir satırda küçük bir sanal boş yer bırakacak kadar uzar.
Öz ve tutarlılık için, GHCI’nin bu kitaptaki varsayılan komut istemlerini "ghci> " adlı komut istemi dizesi ile değiştirdik.
Eğer bunu kendiniz yapmak istiyorsanız, GHCI’nin ": set" adlı konut istemini direktifini aşağıdaki gibi kullanın:
Prelude> :set prompt "ghci> "
ghci>
Prelude her zaman dolaylı olarak mevcuttur; tanımladığı türleri, değerleri veya fonksiyonları kullanmak için herhangi bir işlem yapmamız gerekmez. Diğer modüllerdeki tanımlamaları kullanmak için, bunları ":modul" komutunu kullanarak GHCI'ye yüklemeliyiz:
ghci> :module + Data.Ratio
Artık rasyonel sayılarla (kesirlerle) çalışmamızı sağlayan "Data.Ratio" modülünün işlevselliğini kullanabiliriz.
TEMEL ETKİLEŞİM: GHCI'Yİ HESAP MAKİNESİ OLARAK KULLANMAK
Kod parçalarını test etmek için uygun bir arayüz sağlamanın yanı sıra, GHCI kolayca erişilebilir bir masaüstü hesap makinesi olarak işlev görebilir. GHCI'da herhangi bir hesap makinesi işlemini kolayca ifade edebiliriz ve ek bir bonus olarak Haskell'e daha fazla aşina oldukça daha karmaşık işlemler de ekleyebiliriz. Hatta yorumlayıcıyı böyle basit bir şekilde kullanmak, Haskell'in nasıl çalıştığına dair bize yardımcı olabilir.
TEMEL ARİTMETİK
GHCI'nin onlarla ne yapacağını görmek için hemen ifadeleri girmeye başlayabiliriz. Temel aritmetik, C ve Python gibi dillere benzer şekilde çalışır - İfadeleri, aşağıdaki gibi, operatör ya da işleçin işlenen nesnelerin arasında göründüğü "infix" (yani işlenenlerin ortasına konan bir "ek") şeklinde yazıyoruz:
ghci> 2 + 2
4
ghci> 31337 * 101
3165037
ghci> 7.0 / 2.0
3.5
Bir ifadeyi " infix " şeklinde yazmak sadece bir kolaylıktan dolayıdır: ayrıca bir ifadeyi operatörün(+, -, *, / gibi), argümanlarından önce geldiği " prefix " yani ön-ek biçiminde de yazabiliriz. Fakat bunu yapmak için, söz konusu operatörü aşağıdaki gibi parantezler içerisine almalıyız:
ghci> 2 + 2 ( infix şeklinde )
4
ghci> (+) 2 2 ( prefix şeklinde )
4
Bu açıklamaların da ima ettiği gibi, Haskell'in tamsayılar ve kayan noktalı sayılar gibi kavramları vardır. Tamsayılar isteğe bağlı olarak büyük olabilir. Mesela burada, (^) operatörü o tamsayının üssünü ya da kuvvetini almayı sağlar:
ghci> 313 ^ 15
27112218957718876716220410905036741257
ARİTMETİK BİR TUHAFLIK: NEGATİF SAYILARI YAZMAK
Haskell bize sayıları nasıl yazmamız gerektiğine dair bir tuhaflık sunar: genelde negatif bir sayıyı parantez içinde göstermek gerekir. Bu, en basit ifadelerin ötesine geçer geçmez bizi etkiler.
Negatif bir sayı yazarak başlayacağız:
ghci> -3
-3
Yukarıdaki kodda kullanılan " - " işareti, tekli bir işleçtir. Diğer bir ifadeyle, aslında "-3" tek sayısını yazmadık; " 3 " sayısını yazdık ve ona " - " operatörünü uyguladık. Bu nedenle; " - " operatörü Haskell'in sadece tekli operatör ya da işlecidir ve onu infix operatörleri ya da işleçleriyle karıştırmamalıyız: (karıştırırsak ne mi olur)
ghci> 2 + -3
<interactive>:1:0:
precedence parsing error
cannot mix `(+)' [infixl 6] and prefix `-' [infixl 6] in the same infix expression
Eğer bir infix operatörünün yanında eksi işaretini kullanmak istiyorsak, o ifadeyi parantezlerle kapatmalıyız:
ghci> 2 + (-3)
-1
ghci> 3 + (-(13 * 37))
-478