Saya akan memesan panduan ini dengan tingkat keahlian yang Anda miliki di Haskell, mulai dari pemula mutlak hingga ahli. Perhatikan bahwa proses ini akan memakan waktu berbulan-bulan (bertahun-tahun?), Jadi agak lama.
Pemula Mutlak
Pertama, Haskell mampu melakukan apa saja, dengan keterampilan yang cukup. Ini sangat cepat (di belakang hanya C dan C ++ dalam pengalaman saya), dan dapat digunakan untuk apa saja dari simulasi ke server, guis dan aplikasi web.
Namun ada beberapa masalah yang lebih mudah ditulis untuk pemula di Haskell daripada yang lain. Masalah matematika dan program proses daftar adalah kandidat yang baik untuk ini, karena mereka hanya membutuhkan pengetahuan Haskell yang paling dasar untuk dapat menulis.
Pertama, beberapa panduan bagus untuk mempelajari dasar-dasar Haskell adalah tutorial haskell belajar bahagia dan 6 bab pertama mempelajari haskell Anda . Saat membaca ini, adalah ide yang sangat bagus untuk juga memecahkan masalah sederhana dengan apa yang Anda ketahui.
Dua sumber yang bagus lainnya adalah Haskell Programming dari prinsip pertama , dan Programming di Haskell . Keduanya dilengkapi dengan latihan untuk setiap bab, sehingga Anda memiliki masalah kecil yang sesuai dengan apa yang Anda pelajari di beberapa halaman terakhir.
Daftar masalah yang bagus untuk dicoba adalah halaman haskell 99 masalah . Ini memulai dengan sangat mendasar, dan menjadi lebih sulit saat Anda melanjutkan. Ini adalah praktik yang sangat baik melakukan banyak hal, karena mereka membiarkan Anda melatih keterampilan Anda dalam rekursi dan fungsi tingkat tinggi. Saya akan merekomendasikan melewatkan setiap masalah yang memerlukan keacakan karena itu sedikit lebih sulit di Haskell. Periksa pertanyaan SO ini jika Anda ingin menguji solusi Anda dengan QuickCheck (lihat Menengah di bawah).
Setelah Anda melakukan beberapa dari itu, Anda bisa melanjutkan untuk melakukan beberapa masalah Project Euler . Ini diurutkan berdasarkan berapa banyak orang yang telah menyelesaikannya, yang merupakan indikasi kesulitan yang cukup baik. Ini menguji logika Anda dan Haskell lebih dari masalah sebelumnya, tetapi Anda masih harus dapat melakukan beberapa yang pertama. Keuntungan besar yang dimiliki Haskell dengan masalah-masalah ini adalah bilangan bulat tidak terbatas ukurannya. Untuk menyelesaikan beberapa masalah ini, akan bermanfaat jika Anda telah membaca bab 7 dan 8 untuk mempelajari Haskell juga.
Pemula
Setelah itu, Anda harus memiliki pegangan yang cukup baik pada fungsi rekursi dan urutan yang lebih tinggi, jadi ini saat yang tepat untuk mulai melakukan beberapa masalah dunia nyata. Tempat yang sangat bagus untuk memulai adalah Real World Haskell (buku online, Anda juga dapat membeli hard copy). Saya menemukan beberapa bab pertama yang diperkenalkan terlalu cepat untuk seseorang yang belum pernah melakukan pemrograman fungsional / menggunakan rekursi sebelumnya. Namun dengan latihan yang akan Anda dapatkan dari melakukan masalah sebelumnya Anda harus menemukannya sangat dimengerti.
Mengatasi masalah dalam buku ini adalah cara yang bagus untuk mempelajari cara mengelola abstraksi dan membangun komponen yang dapat digunakan kembali di Haskell. Ini sangat penting bagi orang-orang yang terbiasa pemrograman berorientasi objek (oo), karena metode abstraksi oo normal (kelas oo) tidak muncul di Haskell (Haskell memiliki kelas tipe, tetapi mereka sangat berbeda dengan kelas oo, lebih seperti antarmuka oo ). Saya tidak berpikir itu ide yang baik untuk melewati bab, karena masing-masing memperkenalkan banyak ide baru yang digunakan dalam bab selanjutnya.
Setelah beberapa saat, Anda akan sampai ke bab 14, bab monad yang ditakuti (dum dum dummmm). Hampir setiap orang yang mempelajari Haskell mengalami kesulitan memahami monad, karena betapa abstrak konsepnya. Saya tidak bisa memikirkan konsep apa pun dalam bahasa lain yang abstrak seperti monad dalam pemrograman fungsional. Monads memungkinkan banyak ide (seperti operasi IO, perhitungan yang mungkin gagal, parsing, ...) disatukan dalam satu ide. Jadi jangan merasa berkecil hati jika setelah membaca bab monad Anda tidak benar-benar memahaminya. Saya merasa bermanfaat untuk membaca banyak penjelasan yang berbeda tentang monad; masing-masing memberikan perspektif baru tentang masalah tersebut. Berikut adalah daftar tutorial monad yang sangat bagus . Saya sangat merekomendasikan All About Monads , tetapi yang lain juga bagus.
Juga, perlu beberapa saat agar konsep-konsep itu benar-benar meresap. Ini muncul melalui penggunaan, tetapi juga melalui waktu. Saya menemukan bahwa kadang-kadang tidur dengan masalah membantu lebih dari yang lain! Akhirnya, idenya akan diklik, dan Anda akan bertanya-tanya mengapa Anda berjuang untuk memahami konsep yang pada kenyataannya sangat sederhana. Ini luar biasa ketika ini terjadi, dan ketika itu terjadi, Anda mungkin menemukan Haskell menjadi bahasa pemrograman imperatif favorit Anda :)
Untuk memastikan bahwa Anda memahami sistem jenis Haskell dengan sempurna, Anda harus mencoba menyelesaikan 20 latihan haskell menengah . Latihan-latihan tersebut menggunakan nama-nama fungsi yang menyenangkan seperti "berbulu" dan "pisang" dan membantu Anda untuk memiliki pemahaman yang baik tentang beberapa konsep pemrograman fungsional dasar jika Anda belum memilikinya. Cara yang bagus untuk menghabiskan malam Anda dengan banyak kertas yang ditutupi dengan panah, unicorn, sosis, dan pisang berbulu.
Menengah
Setelah Anda memahami Monads, saya pikir Anda telah melakukan transisi dari programmer Haskell pemula ke haskeller perantara. Jadi kemana harus pergi dari sini? Hal pertama yang saya sarankan (jika Anda belum mempelajarinya dari mempelajari monad) adalah berbagai jenis monad, seperti Reader, Writer, dan State. Sekali lagi, dunia nyata Haskell dan All about monads memberikan liputan besar tentang ini. Untuk menyelesaikan pelatihan monad Anda, belajar tentang transformer monad adalah suatu keharusan. Ini memungkinkan Anda menggabungkan berbagai jenis Monads (seperti Reader dan State monad) menjadi satu. Ini mungkin tampaknya tidak berguna untuk memulai, tetapi setelah menggunakannya sebentar Anda akan bertanya-tanya bagaimana Anda hidup tanpa mereka.
Sekarang Anda dapat menyelesaikan buku Haskell dunia nyata jika Anda mau. Melewati bab-bab sekarang tidak terlalu penting, selama Anda memiliki monad tepuk. Pilih saja yang Anda minati.
Dengan pengetahuan yang Anda miliki sekarang, Anda harus dapat menggunakan sebagian besar paket di komplotan rahasia (baik yang didokumentasikan setidaknya ...), serta sebagian besar perpustakaan yang datang dengan Haskell. Daftar pustaka yang menarik untuk dicoba adalah:
Parsec : untuk parsing program dan teks. Jauh lebih baik daripada menggunakan regexps. Dokumentasi yang luar biasa, juga memiliki bab Haskell dunia nyata.
QuickCheck : Program pengujian yang sangat keren. Apa yang Anda lakukan adalah menulis predikat yang harus selalu benar (mis length (reverse lst) == length lst
.). Anda kemudian lulus predikat QuickCheck, dan itu akan menghasilkan banyak nilai acak (dalam daftar kasus ini) dan menguji bahwa predikat itu benar untuk semua hasil. Lihat juga manual online .
HUnit : Unit testing di Haskell.
gtk2hs : Kerangka kerja gui paling populer untuk Haskell, memungkinkan Anda menulis aplikasi gtk di Haskell.
happstack : Kerangka pengembangan web untuk Haskell. Tidak menggunakan database, sebagai gantinya tipe toko data. Dokumen yang cukup bagus (kerangka kerja populer lainnya akan menjadi snap dan yesod ).
Juga, ada banyak konsep (seperti konsep Monad) yang akhirnya harus Anda pelajari. Ini akan lebih mudah daripada belajar Monads pertama kali, karena otak Anda akan terbiasa berurusan dengan tingkat abstraksi yang terlibat. Tinjauan yang sangat baik untuk mempelajari konsep-konsep tingkat tinggi ini dan bagaimana mereka cocok bersama adalah Typeclassopedia .
Berlaku: Antarmuka seperti Monads, tetapi kurang kuat. Setiap Monad adalah Aplikatif, tetapi tidak sebaliknya. Ini berguna karena ada beberapa jenis yang berlaku tetapi bukan Monads. Selain itu, kode yang ditulis menggunakan fungsi Aplikasi seringkali lebih mudah dikomposisikan daripada menulis kode yang setara menggunakan fungsi Monad. Lihat Functors, Functors Applicative, dan Monoids dari panduan Anda haskell.
Foldable , Traversable : Typeclasses yang abstrak banyak dari operasi daftar, sehingga fungsi yang sama dapat diterapkan ke jenis wadah lainnya. Lihat juga penjelasan wiki haskell .
Monoid : Monoid adalah tipe yang memiliki nilai nol (atau mempty), dan operasi, yang dinotasikan <>
yang menggabungkan dua monoid bersama-sama, sehingga x <> mempty = mempty <> x = x
dan x <> (y <> z) = (x <> y) <> z
. Ini disebut hukum identitas dan asosiatif. Banyak jenis Monoids, seperti angka, dengan mempty = 0
dan <> = +
. Ini berguna dalam banyak situasi.
Panah : Panah adalah cara mewakili perhitungan yang mengambil input dan mengembalikan output. Fungsi adalah tipe panah yang paling dasar, tetapi ada banyak tipe lainnya. Perpustakaan juga memiliki banyak fungsi yang sangat berguna untuk memanipulasi panah - mereka sangat berguna bahkan jika hanya digunakan dengan fungsi Haskell tua biasa.
Array : berbagai array yang bisa berubah / tidak dapat diubah di Haskell.
ST Monad : memungkinkan Anda menulis kode dengan status bisa berubah yang berjalan sangat cepat, sementara masih tetap murni di luar monad. Lihat tautan untuk detail lebih lanjut.
FRP: Pemrograman Reaktif Fungsional, cara eksperimental baru dalam penulisan kode yang menangani peristiwa, pemicu, input, dan output (seperti gui). Saya tidak tahu banyak tentang ini. Pembicaraan Paul Hudak tentang yampa adalah awal yang baik.
Ada banyak fitur bahasa baru yang harus Anda lihat. Saya hanya akan daftar mereka, Anda dapat menemukan banyak info tentang mereka dari google, wikibook haskell , situs haskellwiki.org dan dokumentasi ghc .
- Kelas tipe multiparameter / dependensi fungsional
- Tipe keluarga
- Jenis yang dikuantifikasi secara eksistensial
- Jenis hantu
- GADTS
- lainnya ...
Banyak Haskell didasarkan pada teori kategori , jadi Anda mungkin ingin melihatnya. Titik awal yang baik adalah Kategori Teori untuk Ilmuwan Komputer . Jika Anda tidak ingin membeli buku itu, artikel terkait penulis juga sangat baik.
Akhirnya, Anda ingin mempelajari lebih lanjut tentang berbagai alat Haskell. Ini termasuk:
- ghc (dan semua fitur-fiturnya)
- komplotan rahasia : sistem paket Haskell
- darcs : sistem kontrol versi terdistribusi yang ditulis dalam Haskell, sangat populer untuk program Haskell.
- haddock : generator dokumentasi otomatis Haskell
Saat mempelajari semua perpustakaan dan konsep baru ini, sangat berguna untuk menulis proyek berukuran sedang di Haskell. Itu bisa apa saja (misalnya game kecil, penganalisa data, situs web, kompiler ). Mengerjakan ini akan memungkinkan Anda untuk menerapkan banyak hal yang sekarang Anda pelajari. Anda tinggal di level ini selama berabad-abad (di sinilah saya berada).
Ahli
Butuh waktu bertahun-tahun untuk mencapai tahap ini (halo mulai 2009!), Tetapi dari sini saya kira Anda mulai menulis makalah phd, ekstensi ghc baru, dan membuat abstraksi baru.
Mendapatkan bantuan
Akhirnya, sementara pada setiap tahap pembelajaran, ada banyak tempat untuk mendapatkan informasi. Ini adalah:
- saluran irc #haskell
- yang milis . Ini layak untuk mendaftar hanya untuk membaca diskusi yang sedang berlangsung - beberapa sangat menarik.
- tempat lain yang tercantum di halaman beranda haskell.org
Kesimpulan
Yah ini ternyata lebih lama dari yang saya harapkan ... Bagaimanapun, saya pikir itu adalah ide yang sangat bagus untuk menjadi mahir di Haskell. Butuh waktu lama, tetapi itu terutama karena Anda mempelajari cara berpikir yang sama sekali baru dengan melakukannya. Ini tidak seperti belajar Ruby setelah belajar Java, tetapi seperti belajar Java setelah belajar C. Juga, saya menemukan bahwa keterampilan pemrograman berorientasi objek saya telah meningkat sebagai hasil dari belajar Haskell, karena saya melihat banyak cara baru untuk mengabstraksi ide.