Selama beberapa hari saya sudah mencoba membungkus kepala saya di sekitar paradigma pemrograman fungsional di Haskell. Saya telah melakukan ini dengan membaca tutorial dan menonton screencasts, tetapi sepertinya tidak ada yang benar-benar menempel. Sekarang, dalam mempelajari berbagai bahasa imperatif / OO (seperti C, Java, PHP), latihan telah menjadi cara yang baik untuk saya gunakan. Tetapi karena saya tidak benar-benar tahu apa yang Haskell mampu dan karena ada banyak konsep baru untuk digunakan, saya belum tahu harus mulai dari mana.
Jadi, bagaimana Anda belajar Haskell? Apa yang membuat Anda benar-benar "memecahkan kebekuan"? Juga, ada ide bagus untuk memulai latihan?
haskell
functional-programming
user50685
sumber
sumber
Jawaban:
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, sehinggax <> mempty = mempty <> x = x
danx <> (y <> z) = (x <> y) <> z
. Ini disebut hukum identitas dan asosiatif. Banyak jenis Monoids, seperti angka, denganmempty = 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 .
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:
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:
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.
sumber
Monad
lebih kuat, tetapi juga kurang komposisional ... banyak orang menggunakan monad di mana mereka bisa lolos denganApplicative
kode bersih . Kebanyakan hal yangFunctor
s jugaMonad
s, tetapi Anda tidak berkeliling menggunakan>>=
danreturn
kapanfmap
akan mencukupi, karena yang terakhir mengarah ke kode yang lebih sederhana jika Anda dapat menggunakannya.Beberapa kolega saya memiliki pengalaman yang baik dengan Pelajari Anda Haskell untuk Great Good! .
Dan memeriksa jawaban disini terlalu
sumber
Inilah buku bagus yang bisa Anda baca online: Real World Haskell
Sebagian besar program Haskell yang saya lakukan adalah menyelesaikan masalah Project Euler .
Salah satu nasihat yang saya baca belum lama ini adalah bahwa Anda harus memiliki satu set standar masalah sederhana yang Anda tahu bagaimana menyelesaikannya (secara teori) dan kemudian setiap kali Anda mencoba mempelajari bahasa baru, Anda menerapkan masalah-masalah itu dalam bahasa itu.
sumber
Saya menikmati menonton seri 13 episode ini tentang Pemrograman Fungsional menggunakan Haskell.
C9 Kuliah: Dr. Erik Meijer - Fundamental Pemrograman Fungsional: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundament-Chapter-1/
sumber
Untuk menambahkan jawaban orang lain - ada satu yang berguna yang akan membantu Anda saat coding (misalnya saat memecahkan masalah Euler proyek): Hoogle . Anda dapat menggunakan antarmuka baris perintah atau antarmuka web .
Garis komando
Setelah Anda menginstal platform Haskell, pastikan untuk melakukannya
cabal install hoogle
Contoh penggunaan hoogle:
Anda memiliki fungsi
f x = 3 * x + 1
dan Anda ingin menerapkannya(5 :: Int)
, lalu menerapkannya pada hasil dan pada hasil itu dan seterusnya dan mendapatkan daftar nilai-nilai yang tak terbatas. Anda curiga mungkin sudah ada fungsi untuk membantu Anda (tidak khusus untuk Andaf
).Fungsi itu akan bertipe
(a -> a) -> a -> [a]
jika dibutuhkanf 5
ataua -> (a -> a) -> [a]
jika dibutuhkan5 f
(kami menganggap fungsi tersebut untuk tipe umum dan bukan hanyaInt
s)ya, fungsi yang Anda butuhkan sudah ada dan itu disebut
iterate
. Anda menggunakannya denganiterate func 5
!Antarmuka web
Hasil untuk contoh yang sama dapat ditemukan di sini .
sumber
Pemrograman Graham Hutton di Haskell singkat, cukup menyeluruh, dan tahun-tahun mengajarnya Haskell benar-benar menunjukkan. Hampir selalu saya sarankan orang-orang mulai, terlepas dari mana Anda pergi dari sana.
Secara khusus, Bab 8 ("Parser Fungsional") memberikan landasan nyata yang Anda butuhkan untuk mulai berurusan dengan monad, dan saya pikir sejauh ini adalah tempat terbaik untuk memulai, diikuti oleh All About Monads . (Namun, berkenaan dengan bab itu, perhatikan errata dari situs web: Anda tidak dapat menggunakan
do
formulir tanpa bantuan khusus. Anda mungkin ingin mempelajari tentang kacamata ketik terlebih dahulu dan menyelesaikan masalah itu sendiri.)Ini jarang ditekankan pada pemula Haskell, tetapi ada baiknya belajar cukup awal bukan hanya tentang menggunakan monad, tetapi tentang membangun sendiri. Ini tidak sulit, dan yang disesuaikan dapat membuat sejumlah tugas lebih sederhana.
sumber
Jangan mencoba membaca semua tutorial monad dengan metafora lucu. Mereka hanya akan membuat Anda terlibat lebih buruk.
sumber
Saya sarankan bergabung dengan saluran #haskell irc dan mengajukan pertanyaan di sana. Begitulah cara saya belajar Haskell. Jika Anda membaca Haskell di Dunia Nyata seperti yang disarankan di atas, jawaban waktu nyata untuk pertanyaan Anda akan sangat membantu. Banyak orang pintar di #haskell menulis Haskell untuk kesenangan dan keuntungan, jadi Anda akan mendapatkan banyak masukan bagus. Cobalah!
sumber
Ini adalah favorit saya
Haskell: Pemrograman Fungsional dengan Jenis
Haskell Dunia Nyata
sumber
Saya juga dapat merekomendasikan Yet Another Haskell Tutorial sebagai pengantar.
Sumber belajar lain yang baik (mungkin pada tingkat menengah), yang telah banyak membantu saya dan belum disebutkan dalam jawaban lain sejauh yang saya bisa lihat, adalah Typeclassopedia dari Brent Yorgey , yang dapat ditemukan di The Monad Reader (Issue 13)
Itu ditulis dalam gaya yang sangat mudah diakses dan mengandung (di antara banyak hal lainnya), saran pengantar berikut:
Monad Reader sendiri adalah harta karun mutlak untuk programmer fungsional (tidak hanya programmer Haskell).
sumber
Coba tuliskan program yang mudah di dalamnya.
Anda dapat menemukan contoh tugas di berbagai buku teks, mungkin.
Saya tidak akan merekomendasikan menempel pada buku teks Haskell / FP, hanya mencoba melakukan hal-hal sederhana dengan itu: perhitungan, manipulasi string, akses file.
Setelah saya memecahkan selusin, saya telah memecahkan es :)
Setelah itu, baca banyak tentang konsep-konsep lanjutan (Monads, Arrows, IO, struktur data rekursif), karena haskell tidak terbatas dan ada banyak dari mereka.
sumber
Saya memang berpikir bahwa mewujudkan fitur Haskell melalui contoh adalah cara terbaik untuk memulai di atas segalanya.
http://en.wikipedia.org/wiki/Haskell_98_features
Ini adalah tipeclasses yang rumit termasuk monad dan panah
http://www.haskell.org/haskellwiki/Typeclassopedia
untuk masalah dunia nyata dan proyek yang lebih besar, ingat tag ini: GHC (compiler paling sering digunakan), Hackage (libraryDB), Cabal (sistem bangunan), darcs (sistem bangunan lain).
Sistem terintegrasi dapat menghemat waktu Anda: http://hackage.haskell.org/platform/
paket database untuk sistem ini: http://hackage.haskell.org/
Wiki kompiler GHC: http://www.haskell.org/haskellwiki/GHC
Setelah Haskell_98_features dan Typeclassopedia, saya pikir Anda sudah dapat menemukan dan membaca dokumentasi tentang mereka sendiri
Omong-omong, Anda mungkin ingin menguji beberapa ekstensi bahasa GHC yang mungkin menjadi bagian dari standar haskell di masa depan.
ini adalah cara terbaik saya untuk belajar haskell. Saya harap ini dapat membantu Anda.
sumber
Saya sarankan Anda mulai dengan membaca tutorial BONUS , dan kemudian membaca Real World Haskell (online gratis) . Bergabunglah dengan saluran #Haskell IRC, di irc.freenode.com , dan ajukan pertanyaan. Orang-orang ini benar-benar ramah pemula, dan telah banyak membantu saya dari waktu ke waktu. Juga, di sini, di SO adalah tempat yang bagus untuk mendapatkan bantuan dengan hal-hal yang tidak dapat Anda pahami! Cobalah untuk tidak berkecil hati, setelah itu klik, pikiran Anda akan hancur.
Tutorial BONUS akan membuat Anda bersemangat, dan membuat Anda siap untuk perjalanan yang mendebarkan yang dibawa oleh Haskell di Real World. Semoga beruntung!
sumber
Jika Anda hanya memiliki pengalaman dengan bahasa imperatif / OO, saya sarankan menggunakan bahasa fungsional yang lebih konvensional sebagai batu loncatan. Haskell benar - benar berbeda dan Anda harus memahami banyak konsep berbeda untuk bisa ke mana saja. Saya sarankan menangani bahasa gaya-ML (seperti misalnya F #) terlebih dahulu.
sumber
Jawaban pertama adalah jawaban yang sangat bagus. Untuk mencapai tingkat Ahli, Anda harus melakukan PhD dengan beberapa Ahli sendiri.
Saya sarankan Anda untuk mengunjungi halaman Haskell: http://haskell.org . Di sana Anda memiliki banyak materi, dan banyak referensi tentang hal-hal terbaru di Haskell, yang disetujui oleh komunitas Haskell.
sumber