Bu kılavuzu Haskell'de sahip olduğunuz beceri seviyesine göre sipariş edeceğim, mutlak bir başlangıçtan bir uzmana kadar. Bu sürecin aylarca (yıl?) Süreceğini unutmayın, bu yüzden oldukça uzun.
Mutlak acemi
Birincisi, Haskell yeterli beceriye sahip her şeyi yapabilir. Çok hızlı (deneyimimde sadece C ve C ++ 'ın arkasında) ve simülasyonlardan sunuculara, guis ve web uygulamalarına kadar her şey için kullanılabilir.
Ancak Haskell'de yeni başlayanlar için yazılması daha kolay bazı problemler var. Matematiksel problemler ve liste süreci programları bunun için iyi adaylardır, çünkü Haskell bilgisinin en temel bilgilerinin yazılmasını gerektirirler.
Birincisi, Haskell'in temellerini öğrenmenin bazı iyi rehberleri mutlu öğrenme haskell öğretici ve size bir haskell öğrenmek ilk 6 bölüm . Bunları okurken, bildiklerinizle ilgili basit problemleri çözmek de çok iyi bir fikirdir.
Başka iki iyi kaynakları olan Haskell ilk prensiplerden Programlama ve Haskell programlama . Her ikisi de her bölüm için alıştırmalarla birlikte gelir, bu nedenle son birkaç sayfada öğrendiklerinizle eşleşen küçük basit problemleriniz vardır.
Denemek için sorunların iyi bir listesi haskell 99 sorunları sayfası . Bunlar çok basit başlar ve ilerledikçe daha da zorlaşır. Bunları bir sürü yapmak çok iyi bir uygulamadır, çünkü özyineleme ve üst düzey işlevlerde becerilerinizi pratik etmenize izin verirler. Haskell'de biraz daha zor olduğu için rastgelelik gerektiren herhangi bir problemi atlamanızı tavsiye ederim. Çözümlerinizi QuickCheck ile test etmek istiyorsanız bu SO sorusunu kontrol edin (aşağıdaki Ara ürüne bakın).
Bunlardan birkaçını yaptıktan sonra, birkaç Project Euler problemine geçebilirsiniz . Bunlar, kaç kişinin onları tamamladığına göre sıralanır, bu da oldukça iyi bir zorluk göstergesidir. Bunlar mantığınızı ve Haskell'inizi önceki sorunlardan daha fazla test eder, ancak yine de ilk birkaçını yapabilmeniz gerekir. Haskell'in bu sorunlarda sahip olduğu büyük bir avantaj, Tamsayıların boyutu sınırlı değildir. Bu sorunların bazılarını tamamlamak için, 7 ve 8. bölümleri okuduğunuzda size bir Haskell öğrenmek de faydalı olacaktır.
Acemi
Bundan sonra, özyineleme ve daha üst düzey işlevler üzerinde oldukça iyi bir ele sahip olmalısınız, bu yüzden daha gerçek dünya problemleri yapmaya başlamak için iyi bir zaman olacaktır. Başlamak için çok iyi bir yer Real World Haskell'dir (çevrimiçi kitap, basılı bir kopya da satın alabilirsiniz). Daha önce fonksiyonel programlama / özyineleme kullanmamış biri için ilk birkaç bölümün çok hızlı bir şekilde tanıtıldığını gördüm. Bununla birlikte, önceki problemleri yapmaktan alacağınız uygulama ile onu mükemmel bir şekilde anlaşılabilir bulmalısınız.
Kitaptaki problemler üzerinde çalışmak, Haskell'de soyutlamaların nasıl yönetileceğini ve yeniden kullanılabilir bileşenlerin nasıl oluşturulacağını öğrenmenin harika bir yoludur. Normal oo soyutlama yöntemleri (oo sınıfları) Haskell'de görünmediği için (Neskell tip sınıflarına sahiptir, ancak oo arabirimlerinden çok oo sınıflarına çok farklı olduğundan, nesne yönelimli (oo) programlamada kullanılan insanlar için bu çok önemlidir. ). Bölümleri atlamanın iyi bir fikir olduğunu düşünmüyorum, çünkü her biri sonraki bölümlerde kullanılan birçok yeni fikir sunuyor.
Bir süre sonra 14. bölüme geçeceksiniz, korkunç monadlar bölümü (dum dum dummmm). Haskell'i öğrenen hemen hemen herkes, kavramın ne kadar soyut olduğu nedeniyle monadları anlamakta zorlanıyor. Fonksiyonel programlamada monadlar kadar soyut olan başka bir dilde herhangi bir kavram düşünemiyorum. Monads, birçok fikrin (ES operasyonları, başarısız olabilecek hesaplamalar, ayrıştırma, ... gibi) tek bir fikir altında birleştirilmesini sağlar. Yani monad bölümünü okuduktan sonra onları gerçekten anlamıyorsan cesaretini kırma. Monadların birçok farklı açıklamasını okumayı yararlı buldum; her biri soruna yeni bir bakış açısı getiriyor. İşte monad öğreticilerinin çok iyi bir listesi . All About Monads tavsiye ederim , ama diğerleri de iyidir.
Ayrıca, kavramların gerçekten batması biraz zaman alıyor. Bu kullanımdan, aynı zamanda zamanla da geliyor. Bazen bir sorun üzerinde uyumak her şeyden daha fazla yardımcı olur! Sonunda, fikir tıklanacak ve gerçekte inanılmaz derecede basit bir kavramı anlamak için neden mücadele ettiğinizi merak edeceksiniz. Bu olduğunda harika, ve böyle olduğunda, Haskell'i en sevdiğiniz zorunlu programlama dili olarak bulabilirsiniz :)
Haskell tipi sistemi mükemmel bir şekilde anladığınızdan emin olmak için 20 ara haskell egzersizini çözmeye çalışmalısınız . "Tüylü" ve "muz" gibi işlevlerin eğlenceli isimlerini kullanan bu alıştırmalar ve henüz sahip değilseniz bazı temel fonksiyonel programlama kavramlarını iyi anlamanıza yardımcı olur. Akşamınızı oklarla, tek boynuzlu atlarla, sosislerle ve tüylü muzlarla kaplı bir demet kağıtla geçirmek için güzel bir yol.
Orta düzey
Monad'ları anladıktan sonra, sanırım yeni başlayan bir Haskell programcısından orta bir haskeller'e geçiş yaptınız. Peki buradan nereye gitmeli? Tavsiye edeceğim ilk şey (eğer onları daha önce monad'lardan öğrenmediyseniz) Reader, Writer ve State gibi çeşitli monad türleri. Yine, Gerçek dünya Haskell ve Monad'lar hakkında her şey bunu büyük ölçüde kapsamaktadır. Monad eğitiminizi tamamlamak için monad transformatörleri hakkında bilgi edinmek şarttır. Bunlar, farklı Monad türlerini (Reader ve State monad gibi) bir araya getirmenizi sağlar. Bu başlangıçta işe yaramaz görünebilir, ancak bir süre kullandıktan sonra onlarsız nasıl yaşadığınızı merak edeceksiniz.
Şimdi isterseniz gerçek dünya Haskell kitabını bitirebilirsiniz. Bölümleri atlamak artık önemli değil. Sadece ilgilendiğiniz şeyi seçin.
Şimdi sahip olacağınız bilgilerle birlikte, Cabal'daki paketlerin çoğunu (en azından belgelenmiş olanları) ve Haskell ile birlikte gelen kütüphanelerin çoğunu kullanabilmelisiniz. Denenecek ilginç kütüphanelerin bir listesi:
Parsec : programları ve metni ayrıştırmak için. Normal ifadeler kullanmaktan çok daha iyi. Mükemmel dokümantasyon, aynı zamanda gerçek bir dünya Haskell bölümüne sahiptir.
QuickCheck : Çok güzel bir test programı. Yaptığınız şey her zaman doğru olması gereken bir yüklem yazmaktır (örn. length (reverse lst) == length lst
). Daha sonra yüklemi QuickCheck'e geçirirsiniz ve çok sayıda rastgele değer üretir (bu durumda listeler) ve yüklemin tüm sonuçlar için doğru olup olmadığını test eder. Ayrıca çevrimiçi kılavuza bakın .
HUnit : Haskell'de birim testi.
gtk2hs : Haskell için en popüler gui çerçevesi, Haskell'de gtk uygulamaları yazmanıza izin verir.
happstack : Haskell için bir web geliştirme çerçevesi. Veri türü deposu yerine veritabanları kullanmaz. Oldukça iyi dokümanlar (diğer popüler çerçeveler snap ve yesod olurdu ).
Ayrıca, sonunda öğrenmeniz gereken birçok kavram (Monad konsepti gibi) vardır. Bu, beyniniz ilgili soyutlama düzeyiyle uğraşmaya alışık olacağından, Monad'ları ilk kez öğrenmekten daha kolay olacaktır. Bu üst düzey kavramları ve bunların nasıl bir araya geldiğini öğrenmek için çok iyi bir bakış Typeclassopedia'dır .
Uygulanabilir: Monads gibi bir arayüz, ancak daha az güçlü. Her Monad Uygulanabilir, ancak tam tersi değildir. Uygulanabilir olan ancak Monad olmayan bazı türler olduğu için bu yararlıdır. Ayrıca, Uygulamalı işlevler kullanılarak yazılan kod genellikle Monad işlevlerini kullanarak eşdeğer kod yazmaktan daha çok oluşturulabilir. Size haskell rehberini öğrenmek için Functors, Uygulamalı Functors ve Monoids bakın .
Katlanabilir , Traversable : Typeclasses aynı işlevleri diğer konteyner türlerine uygulanabilir böylece listelerin operasyonların soyut birçok. Ayrıca bkz. Haskell wiki açıklaması .
Monoid : Monoid, sıfır (veya mempty) değerine ve <>
iki Monoidi birleştiren bir işlem olan x <> mempty = mempty <> x = x
ve böyle bir işlemdir x <> (y <> z) = (x <> y) <> z
. Bunlara kimlik ve ilişkilendirilebilirlik yasaları denir. Birçok tip, mempty = 0
ve ile sayılar gibi Monoidlerdir <> = +
. Bu birçok durumda yararlıdır.
Oklar : Oklar, bir girdi alıp çıktı döndüren hesaplamaları temsil etmenin bir yoludur. Bir işlev en temel ok türüdür, ancak başka birçok tür vardır. Kütüphane ayrıca okları işlemek için çok kullanışlı işlevlere sahiptir - sadece düz eski Haskell işlevleriyle kullanılsa bile çok yararlıdır.
Diziler : Haskell'deki çeşitli değişken / değişmez diziler.
ST Monad : Monad dışında saf kalırken çok hızlı çalışan değişebilir bir duruma sahip kod yazmanıza olanak tanır. Daha fazla ayrıntı için bağlantıya bakın.
FRP: Fonksiyonel Reaktif Programlama, olayları, tetikleyicileri, girişleri ve çıkışları (gui gibi) işleyen yeni, deneysel bir kod yazma yolu. Bununla ilgili pek bir şey bilmiyorum. Paul Hudak'ın yampa hakkında konuşması iyi bir başlangıç.
Göz atmanız gereken birçok yeni dil özelliği var. Sadece google, onlar hakkında birçok bilgi bulabilirsiniz, onları listeleriz haskell Vikikitap , haskellwiki.org site ve ghc belgeler .
- Çok parametreli tip sınıfları / fonksiyonel bağımlılıklar
- Tip aileler
- Varoluşçu olarak nicelenen tipler
- Fantom türleri
- GADTS
- diğerleri ...
Birçok Haskell kategori teorisine dayanmaktadır , bu yüzden buna bakmak isteyebilirsiniz. İyi bir başlangıç noktası, Bilgisayar Bilimcisi için Kategori Teorisi'dir . Kitabı satın almak istemiyorsanız, yazarın ilgili makalesi de mükemmeldir.
Son olarak çeşitli Haskell araçları hakkında daha fazla bilgi edinmek isteyeceksiniz. Bunlar:
- ghc (ve tüm özellikleri)
- cabal : Haskell paket sistemi
- darcs : Haskell'de yazılmış, Haskell programları için çok popüler olan dağıtılmış bir sürüm kontrol sistemi.
- mezgit balığı : Haskell otomatik dokümantasyon üreticisi
Tüm bu yeni kütüphaneleri ve kavramları öğrenirken, Haskell'de orta büyüklükte bir proje yazmak çok yararlıdır. Herhangi bir şey olabilir (örneğin küçük bir oyun, veri analizörü, web sitesi, derleyici ). Bunun üzerinde çalışmak, şimdi öğrendiğiniz şeylerin çoğunu uygulamanıza izin verecektir. Yaşınız boyunca bu seviyede kalıyorsunuz (işte buradayım).
Uzman
Bu aşamaya (2009'dan merhaba!) Ulaşmanız yıllar alacaktır, ancak buradan doktora kağıtları, yeni ghc uzantıları yazmaya ve yeni soyutlamalar yapmaya başladığınızı tahmin ediyorum.
Yardım almak
Son olarak, öğrenmenin herhangi bir aşamasında, bilgi almak için birden fazla yer vardır. Bunlar:
- #haskell irc kanalı
- posta listeleri . Bunlar sadece gerçekleşen tartışmaları okumak için kaydolmaya değer - bazıları çok ilginç.
- haskell.org ana sayfasında listelenen diğer yerler
Sonuç
Bu beklediğimden daha uzun oldu ... Her neyse, bence Haskell'de yetkin olmak çok iyi bir fikir. Uzun zaman alır, ancak bunun nedeni esas olarak bunu yaparak tamamen yeni bir düşünme şekli öğreniyor olmanızdır. Java öğrendikten sonra Ruby öğrenmek gibi değil, C öğrendikten sonra Java öğrenmek gibi. Ayrıca, fikirleri soyutlamanın birçok yeni yolunu gördüğüm için, Haskell'i öğrenmenin bir sonucu olarak nesne odaklı programlama becerilerimin geliştiğini görüyorum.