Haskell ile çalışmaya başlama


755

Birkaç gün boyunca başımı Haskell'deki fonksiyonel programlama paradigmasının etrafına sarmaya çalıştım. Bunu öğreticileri okuyarak ve ekran görüntülerini izleyerek yaptım, ama hiçbir şey gerçekten yapışmıyor gibi görünüyor. Şimdi, çeşitli zorunlu / OO dillerini (C, Java, PHP gibi) öğrenirken, egzersizler benim için iyi bir yol oldu. Ama Haskell'in neler yapabileceğini tam olarak bilmediğim ve kullanacağım birçok yeni kavram olduğu için nereden başlayacağımı bilmiyorum.

Peki Haskell'i nasıl öğrendin? Seni gerçekten "buzları kıran" ne yapan? Ayrıca, egzersiz yapmaya başlamak için iyi fikirler var mı?


Yanıtlar:


2476

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 = xve böyle bir işlemdir x <> (y <> z) = (x <> y) <> z. Bunlara kimlik ve ilişkilendirilebilirlik yasaları denir. Birçok tip, mempty = 0ve 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.


35
Yay okları! Önce monadların beynini şekillendirmesine izin verirsin, sonra kafanın üzerinde dur ve komonadları düşünürsün ve sonra her ikisini de aynı anda ok almak için yaparsın :) Haskell'de tip seviyesi ile açılabilen çok fazla etkileyici güç var programlama da.
ephemient

13
@ nanothief Monaddaha güçlü, ama aynı zamanda daha az kompozisyonlu ... birçok insan daha temiz Applicativekodlarla kurtulabilecek monad kullanıyor . S olan çoğu şey Functorde Monads'dir, ancak kullanarak >>=ve returnne fmapzaman yeterli olmazsınız , çünkü ikincisi kullanabiliyorsanız çok daha basit bir koda yol açar.
Tom Crockett

8
@pelotom, typeclassopedia bağlantısını ve bu bölüme Uygulayıcı'yı kullanmak için daha iyi bir neden ekledim ve Functor bölümünü kaldırdım. Çoğu öğretim materyalinde (RWH dahil) Monad'lara yapılan vurgu nedeniyle Monad ve Uygulayıcı kavramları doğru sıraya koymak zordur. Öte yandan, size bir haskell öğretici öğretmek, başlangıçta cevabı yazdığımdan beri (yaklaşık 2 yıl: O) uzun bir yol kat etti ve Monad'dan önce Uygulamalı öğretiyor, belki de şimdi haskell öğrenmenin önerilen yolu olmalı.
David Miani

2
Harika tavsiye. Buna bir yıl önce başladım ve Orta aşamadan geçiyorum. Geri bildirim: RWH'nin monad bölümü (bölüm 14) yetersiz açıklanmıştır. RWH'nin çevrimiçi versiyonunu okumak faydalıdır, çünkü bölüme yardımcı olan kitle kaynaklı yorumlar içerir. FWIW, Monad'ları icat edebilirdin , benim için en iyi çalışan monad öğreticisiydi.
Tom

6
@tomf: Teşekkürler! Her zaman bu cevabın ne kadar başarılı olduğuna şaşırdım - yazdığımdan bu yana yaklaşık beş yıl geçti ama hala güçlü. Biraz güncel olmadığı için yakında bir güncelleme yapmam gerekecek. Lenslerden, borulardan, kısıtlama çeşitlerinden, haskell platformundan, tip seviyesi numaralarından bahsetmiyor ve yazıldığından beri oldukça önemli yeni konular. RWH'nin artık o kadar iyi olmadığı, uzun zamandır güncellenmediği ve örneklerin birçoğunun derlenmediği konusunda haklısınız. Yine de size yardımcı olduğu için memnunum.
David Miani

179

Bazı meslektaşlarım, Büyük İyilik İçin Haskell'i Öğrenin ile iyi deneyime sahipti ! .

Eğitici, zorunlu programlama dillerinde deneyimi olan ancak daha önce işlevsel bir dilde programlanmamış kişilere yöneliktir.

Ve cevapları burada da kontrol edin


27
Bunu ikinciyim. Ayrıca, belli olmadığı için, öğreticinin indirilebilir bir pdf sürümüne bir bağlantı: learnyouahaskell.com/learnyouahaskell.pdf Web tasarımı harika, ancak metro için de bir kopyam var.
Telemachus

8
Bununla başladım, ama bence doğrudan Gerçek Dünya Haskell'e gitmelisin. Aradaki fark, K&R'den C öğrenmeye ya da basit olmaya çalışan ama yaklaşımı ile önemli şeyleri özleyen "aptallar için C" ye benzer. Bence Haskell'i “zorunlu yol” u öğrenmek yerine gerçekleri düzeltmek daha iyidir.
John Smith

7
Bunu kesinlikle SEVİYORUM ve buna ve Gerçek Dünya Haskell'e çok zaman harcadım. IMO, "Bir Haskell Öğrenin", her ikisi de harika kaynaklar olsa da, Gerçek Dünya Haskell'den daha derin bir fikir verir.
Charlie Flowers

7
@ abababa22 Bence önce LYAH okumak sonra RWH'ye gitmek en iyi fikir. LYAH size sadece Haskell'i öğretmez; size fonksiyonel programlamayı öğretir. Sorunları çözerken işlevsel bir şekilde düşünmeye başlarsınız. Açıkçası, sadece LYAH büyük bir uygulama yazmak için yeterli olmaz, ancak zihninizi doğru şekilde büker. Zorunlu bir geçmişe sahipseniz, bu en iyi yoldur, IMO
Abdulsattar Mohammed

4
@Telemachus Sadece not: PDF son sürüm değil, en azından son bölümü kaçırıyor.
sdcvvc

103

Online okuyabileceğiniz iyi bir kitap: Real World Haskell

Yaptığım Haskell programlarının çoğu Project Euler sorunlarını çözmek oldu .

Bir zamanlar çok uzun zaman önce okumadığım bir tavsiye parçası, nasıl çözüleceğini bildiğiniz standart bir dizi basit probleminiz olması gerektiğiydi ve sonra yeni bir dil öğrenmeye çalıştığınızda bu sorunları o dilde uygularsınız.


2
Gerçek Dünya Haskell benim deneyimim harika, bölüm 5'e ulaşana kadar. O zamandan itibaren bunu tavsiye etmem.
MasterMastic

Neden @MasterMastic? 5. bölümün ötesindeki sorun nedir? Parayı harcamadan önce bilmek istiyorum.
Jay Blanchard

@JayBlanchard Bölüm 5'te, güzel bir kütüphanenin somut bir örneğini almaya başlıyorsunuz, ancak size ne yapacaklarını söylüyorlar, yapıyorlar, ama nedenini açık ve net bir şekilde açıklamıyorlar ve orada Biraz sihirli onaltılı değişmez. Sadece hareketlerden geçiyorsun. Bu benim için en büyük sorun değildi, en büyük sorun, kitabın bu tür zor ve uzun örneklere (tüm bölümden daha fazlasını alacak kadar uzun) dayanmasıydı. İstediğiniz parçaları okumak zor. Bence büyük yazarlar, şaşırtıcı bilgi ama son derece kötü uygulama.
MasterMastic


69

Başkalarının cevaplarına eklemek için - kodlama yaparken size yardımcı olacak bir tane var (örneğin, proje Euler sorunlarını çözerken): Hoogle . Komut satırı arabirimini veya web arabirimini kullanabilirsiniz .

Komut satırı

Haskell platformunu kurduktan sonra cabal install hoogle

Hoogle kullanım örneği:

Bir fonksiyonunuz var f x = 3 * x + 1ve onu üzerine uygulamak (5 :: Int), sonra sonuca ve sonuca uygulamak ve bu gibi şeylerin sonsuz bir listesini almak istiyorsunuz. Size yardımcı olacak bir işlev olduğundan şüpheleniyorsunuz (özellikle sizin için değil f).

Bu işlev, (a -> a) -> a -> [a]alırsa f 5veya a -> (a -> a) -> [a]alırsa türden olur 5 f(işlevin sadece Ints değil, genel türler için olduğunu varsayarız )

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

Evet, ihtiyacınız olan fonksiyon zaten var ve buna çağrı var iterate. tarafından kullanın iterate func 5!

Web arayüzü

Aynı örneğin sonucu burada bulunabilir .


İhtiyacınız olan şey için standart kitaplık işlevlerini bulmak, Hoogle'a ihtiyacınız olan şeyi nasıl soracağınızı anladıktan sonra çok daha kolay hale gelir.
ankh-morpork

57

Graham Hutton'un Haskell'deki Programlaması özlü, makul derecede kapsamlı ve Haskell'i öğrettiği yıllar gerçekten gösteriyor. Neredeyse her zaman oradan nereye gittiğinizden bağımsız olarak insanların başlamalarını tavsiye ederim.

Özellikle, Bölüm 8 ("Fonksiyonel Ayrıştırıcılar"), monadlarla uğraşmaya başlamak için ihtiyaç duyduğunuz gerçek temelleri sağlar ve bence başlamak için en iyi yer, ardından Monads Hakkında Her Şey . (Bununla birlikte, bu bölümle ilgili olarak, web sitesinden gelen hataları not edin, ancak doözel bir yardım almadan formu kullanamazsınız . Önce tipik sınıflar hakkında bilgi edinmek ve bu sorunu kendi başınıza çözmek isteyebilirsiniz.)

Bu, Haskell yeni başlayanlar için nadiren vurgulanır, ancak sadece monadları kullanmakla değil, kendi başınıza inşa etmekle ilgili oldukça erken öğrenmeye değer. Zor değil ve özelleştirilmiş olanlar bir dizi görevi daha basit hale getirebilir.


5
Bu tamamen takdir edilmeyen bir kitap (ve cevap). İşlevsel ayrıştırıcılarla ilgili bölüm, ardından hiçbiri monadlardan bahsetmeyen IO hakkında bir bölüm, gerçekten zarif bir pedagojik yaklaşım olarak parlıyor.
michiakig


31

#Haskell irc kanalına katılmanızı ve orada sorular sormanızı öneririm . Haskell'i böyle öğrendim. Yukarıda önerildiği gibi Real World Haskell'den geçerseniz, sorularınıza gerçek zamanlı cevaplar büyük ölçüde yardımcı olacaktır. #Haskell'deki birçok akıllı insan Haskell'i eğlence ve kâr için yazıyor, bu yüzden çok iyi girdiler elde edeceksiniz. Dene!


5
1 - Açık olmak gerekirse: Do not öğrenmek sadece irc kanalı ile. Olduğu gibi girmeyin ve "Haskell programını nasıl yazarım? Nasıl numara eklerim?" Diye sormayın.
alternatif

Irc freenode'a ek olarak, son zamanlarda Discord sohbetlerinde haskell hakkında büyüyen canlı bir tartışma var.
truthadjustr


19

Ayrıca bir başka Haskell Tutorial giriş olarak tavsiye ederim .

Bana çok yardımcı oldu ve görebildiğim kadar diğer yanıtlar söz edilmemiştir başka iyi öğrenme kaynağı (muhtemelen orta düzeyde), Brent Yorgey en olduğunu Typeclassopedia bulunabilir, Monad Reader (Sayı 13)

Çok erişilebilir bir tarzda yazılmıştır ve (diğer birçok şeyin yanında), aşağıdaki giriş tavsiyelerini içerir:

Uzman Haskell hacker'ın bilgeliğinin iki anahtarı vardır:

  1. Türleri anlayın.

  2. Her tür sınıf için derin bir sezgi kazanın ve diğer tür sınıflarla olan ilişkisi hakkında birçok örneğe aşina olun.

Monad Okuyucunun kendisi, işlevsel programcılar için mutlak bir hazinedir (sadece Haskell programcıları için değil).


14

İçine kolay programlar yazmayı deneyin.

Muhtemelen çeşitli ders kitaplarında örnek görevler bulabilirsiniz.

Ben Haskell / FP ders kitaplarına yapışmasını tavsiye etmem, sadece onunla basit şeyler yapmaya çalışın: hesaplamalar, dize manipülasyonları, dosya erişimi.

Bir düzine çözdükten sonra buzu kırdım :)

Bundan sonra, gelişmiş kavramlar (Monads, Arrows, IO, özyinelemeli veri yapıları) hakkında çok şey okuyun, çünkü haskell sonsuzdur ve birçoğu vardır.


14

Haskell'in özelliğini örneklerle gerçekleştirmenin her şeyden önce başlamanın en iyi yolu olduğunu düşünüyorum.

http://en.wikipedia.org/wiki/Haskell_98_features

İşte monadlar ve oklar dahil zor tipler

http://www.haskell.org/haskellwiki/Typeclassopedia

gerçek dünya sorunları ve daha büyük proje için şu etiketleri hatırlayın: GHC (en çok kullanılan derleyici), Hackage (kütüphaneDB), Cabal (bina sistemi), darcs (başka bir bina sistemi).

Entegre bir sistem zaman kazandırabilir: http://hackage.haskell.org/platform/

Bu sistem için paket veritabanı: http://hackage.haskell.org/

GHC derleyicisinin wiki'si: http://www.haskell.org/haskellwiki/GHC

Haskell_98_features ve Typeclassopedia'dan sonra, onlar hakkındaki belgeleri zaten kendiniz bulabilir ve okuyabilirsiniz

Bu arada, gelecekte haskell standardının bir parçası olabilecek bazı GHC'nin dil uzantılarını test etmek isteyebilirsiniz.

Haskell öğrenmenin en iyi yolu bu. umarım size yardımcı olabilir.


13

Öncelikle BONUS'un öğreticisini ve ardından Real World Haskell'i (ücretsiz çevrimiçi) okuyarak başlamanızı öneririm . İrc.freenode.com adresindeki #Haskell IRC kanalına katılın ve sorular sorun. Bu insanlar kesinlikle acemi dostu ve zamanla bana çok yardımcı oldu. Ayrıca, tam burada SO kavramak olamazdı şeylerle yardım almak için harika bir yerdir! Cesareti kırmamaya çalışın, tıkladıktan sonra zihniniz patlayacak.

BONUS'un öğreticisi sizi hazırlayacak ve Real World Haskell'in getirdiği heyecanlı yolculuğa hazır olacak. Sana şans diliyorum!


12

Sadece zorunlu / OO dillerinde deneyiminiz varsa, daha geleneksel bir fonksiyonel dili basamak taşı olarak kullanmanızı öneririm. Haskell gerçekten farklı ve her yere ulaşmak için birçok farklı konsepti anlamalısınız. Önce ML tarzı bir dille (örneğin F # gibi) mücadele etmenizi öneririm.


Karaağaç bu alternatiflerin en yakın, daha kullanışlı ve başlangıç ​​dostu olabilir ...
Pedro Rolo

1
F # gibi geçici bir rotadan geçerek katılmıyorum. Benim için, bir votka içmek gibi, onu hızlı bir şekilde yudumlamanız gerekiyor. Bu şekilde daha acı verici, ama zevk de orada. Geçici yollar, sadece benim için daha fazla karışıklığa yol açar.
truthadjustr

10

İlk cevap çok iyi. Uzman seviyesine ulaşmak için bazı Uzmanlarla birlikte doktora yapmalısınız.

Haskell sayfasını ziyaret etmenizi öneririm: http://haskell.org . Burada, Haskell topluluğunun onayladığı Haskell'deki en güncel materyallere çok fazla materyal ve çok sayıda referansınız var.


2
Üzgünüm ama burada doktora argümanını kullanmak, iyi bir şef olmak için 300 $ mutfak bıçağına sahip olmanız gerektiğini söylemek gibidir. Haskell'in babası olan Simon Peyton Jones'un da doktora derecesi yok. Hem burada hem de başka alanlarda uzmanlığa yol açan uygulama ve sebattır.
Petras Purlys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.