Memulai dengan Haskell

755

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?

user50685
sumber
14
tryhaskell.org
Kirk Broadhurst

Jawaban:

2476

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 = xdan x <> (y <> z) = (x <> y) <> z. Ini disebut hukum identitas dan asosiatif. Banyak jenis Monoids, seperti angka, dengan mempty = 0dan <> = +. 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.

David Miani
sumber
35
Panah Yay! Pertama Anda membiarkan monad membentuk otak Anda, kemudian Anda berdiri di atas kepala Anda dan berpikir tentang comonads, dan kemudian Anda melakukan keduanya pada saat yang sama untuk mendapatkan panah :) Ada banyak kekuatan ekspresif di Haskell yang dapat dibuka dengan tipe-level pemrograman juga.
ephemient
13
@nanothief Monadlebih kuat, tetapi juga kurang komposisional ... banyak orang menggunakan monad di mana mereka bisa lolos dengan Applicativekode bersih . Kebanyakan hal yang Functors juga Monads, tetapi Anda tidak berkeliling menggunakan >>=dan returnkapan fmapakan mencukupi, karena yang terakhir mengarah ke kode yang lebih sederhana jika Anda dapat menggunakannya.
Tom Crockett
8
@pelotom, saya telah menambahkan tautan typeclassopedia serta alasan yang lebih baik untuk menggunakan Applicative ke bagian itu, dan menghapus bagian Functor. Sulit mendapatkan konsep Monad dan Aplikatif dalam urutan yang benar karena penekanan pada Monad di sebagian besar bahan ajar (termasuk RWH). Di sisi lain, mengajarkan Anda tutorial haskell telah datang jauh sejak saya awalnya menulis jawabannya (hampir 2 tahun: O), dan mengajarkan Applicative sebelum Monad, mungkin itu sekarang seharusnya menjadi cara yang direkomendasikan untuk belajar haskell.
David Miani
2
Saran bagus. Saya memulai ini lebih dari setahun yang lalu, dan saya sebagian besar melalui tahap Menengah. Umpan balik: Bab monad RWH (bab 14) tidak dijelaskan dengan baik. Membaca versi online RWH bermanfaat, karena berisi komentar crowdsourced yang membantu bab ini. FWIW, Anda Bisa Menemukan Monad, adalah tutorial monad yang paling cocok untuk saya.
Tom
6
@ Tomf: Terima kasih! Saya selalu kagum pada seberapa baik jawaban ini dilakukan - sudah hampir lima tahun sejak saya menulisnya tetapi masih kuat. Saya akan perlu melakukan pembaruan untuk itu segera, karena agak ketinggalan zaman. Itu tidak menyebutkan lensa, pipa, jenis kendala, platform haskell, jenis angka tingkat, dan mereka adalah topik baru yang cukup besar sejak ini ditulis. Anda benar bahwa RWH tidak sebagus lagi, itu tidak diperbarui dalam waktu yang lama dan banyak contoh tidak dikompilasi. Saya senang itu masih membantu Anda.
David Miani
180

Beberapa kolega saya memiliki pengalaman yang baik dengan Pelajari Anda Haskell untuk Great Good! .

Tutorial ditujukan untuk orang-orang yang memiliki pengalaman dalam bahasa pemrograman imperatif tetapi belum pernah memprogram dalam bahasa fungsional sebelumnya.

Dan memeriksa jawaban disini terlalu

jitter
sumber
27
Saya yang kedua ini. Juga, karena tidak jelas, berikut ini tautan ke versi tutorial pdf yang dapat diunduh: learnyouahaskell.com/learnyouahaskell.pdf Desain webnya bagus, tetapi saya juga ingin memiliki salinan untuk kereta bawah tanah.
Telemachus
8
Saya mulai dengan ini, tetapi pendapat saya adalah Anda harus pergi langsung ke Real World Haskell. Perbedaannya adalah seperti belajar C dari K&R atau "C for dummies" yang mencoba menjadi sederhana, tetapi melewatkan hal-hal penting dengan pendekatannya. Saya pikir lebih baik meluruskan fakta daripada mencoba mempelajari Haskell "cara imperatif".
John Smith
7
Saya benar-benar MENYUKAINYA, dan saya telah menginvestasikan banyak waktu untuk ini dan Haskell di Dunia Nyata. IMO, "Learn You a Haskell" memberikan wawasan yang lebih dalam daripada Real World Haskell, meskipun mereka berdua adalah sumber daya yang hebat.
Charlie Flowers
7
@ abababa22 Saya pikir membaca LYAH dulu dan kemudian pergi ke RWH adalah ide terbaik. LYAH tidak mengajarimu hanya Haskell; itu mengajarkan Anda pemrograman fungsional. Anda mulai berpikir secara fungsional ketika Anda memecahkan masalah. Jelas, hanya LYAH tidak akan cukup untuk menulis aplikasi besar, tetapi itu menekuk pikiran Anda dengan cara yang benar. Jika Anda berasal dari latar belakang keharusan, ini adalah cara terbaik, IMO
Abdulsattar Mohammed
4
@Telemachus Hanya untuk dicatat: PDF bukan versi final, setidaknya tidak ada bab terakhir.
sdcvvc
103

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.

David Johnstone
sumber
2
Dunia Nyata Haskell dalam pengalaman saya sangat bagus, sampai Anda mencapai bab 5. Sejak saat itu saya tidak akan merekomendasikannya.
MasterMastic
Kenapa @MasterMastic? Apa masalah di luar bab 5? Saya ingin tahu sebelum saya menghabiskan uang.
Jay Blanchard
@JayBlanchard Dalam bab 5 Anda mulai mendapatkan contoh konkret perpustakaan, yang bagus, tetapi mereka memberi tahu Anda apa yang akan mereka lakukan, lakukan, tetapi mereka tidak menjelaskan mengapa sama sekali, dan tidak jelas sama sekali, dan ada cukup banyak hex magic literal. Anda hanya melalui gerakan. Itu bukan masalah terbesar bagiku, masalah terbesar adalah bahwa buku itu sangat tergantung pada contoh-contoh yang keras dan panjang (cukup lama untuk mengambil lebih dari satu bab penuh). Anda hampir tidak bisa hanya membaca bagian yang Anda inginkan. Saya pikir penulis yang hebat, pengetahuan yang luar biasa tetapi eksekusi yang sangat buruk.
MasterMastic
69

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 + 1dan 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 Anda f).

Fungsi itu akan bertipe (a -> a) -> a -> [a]jika dibutuhkan f 5atau a -> (a -> a) -> [a]jika dibutuhkan 5 f(kami menganggap fungsi tersebut untuk tipe umum dan bukan hanya Ints)

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

ya, fungsi yang Anda butuhkan sudah ada dan itu disebut iterate. Anda menggunakannya dengan iterate func 5!

Antarmuka web

Hasil untuk contoh yang sama dapat ditemukan di sini .

yairchu
sumber
Menemukan fungsi pustaka standar untuk apa yang Anda butuhkan menjadi jauh lebih mudah setelah Anda memahami bagaimana cara meminta Hoogle untuk apa yang Anda butuhkan.
ankh-morpork
57

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 doformulir 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.

Curt Sampson
sumber
5
Ini adalah buku yang sangat tidak dihargai (dan jawabannya). Bab tentang parser fungsional, diikuti oleh bab tentang IO, yang tidak satu pun menyebutkan monad, benar-benar bersinar sebagai pendekatan pedagogis yang elegan.
michiakig
52

Jangan mencoba membaca semua tutorial monad dengan metafora lucu. Mereka hanya akan membuat Anda terlibat lebih buruk.

John Smith
sumber
5
Sepakat! Lihat 'Abstraksi, intuisi, dan “fallacy tutorial monad”': byorgey.wordpress.com/2009/01/12/…
ShreevatsaR
31

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!

Shapr
sumber
5
1 - Untuk menjadi jelas: Do tidak mempelajarinya hanya dengan saluran irc. Seperti di, jangan masuk dan bertanya "Bagaimana cara saya menulis program haskell? Bagaimana cara menambahkan angka?"
alternatif
Selain irc freenode, akhir-akhir ini juga ada diskusi yang hidup tentang haskell di obrolan Discord.
truthadjustr
19

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:

Ada dua kunci kearifan ahli Haskell peretas:

  1. Pahami jenisnya.

  2. Dapatkan intuisi mendalam untuk setiap kelas tipe dan hubungannya dengan kelas tipe lainnya, didukung oleh keakraban dengan banyak contoh.

Monad Reader sendiri adalah harta karun mutlak untuk programmer fungsional (tidak hanya programmer Haskell).

Greg S
sumber
14

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.

alamar
sumber
14

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.

snowcake dan icejelly
sumber
13

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!

Rayne
sumber
12

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.

JacquesB
sumber
Elm mungkin yang paling dekat, lebih berguna, dan lebih ramah-pemula dari alternatif-alternatif ini ...
Pedro Rolo
1
Saya tidak setuju saat melewati rute sementara, seperti F #. Bagi saya, ini seperti meminum vodka yang harus Anda minum dengan cepat. Lebih menyakitkan seperti itu, tetapi kesenangan juga ada di sana. Rute sementara, hanya membuat saya lebih bingung.
truthadjustr
10

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.

Fidel
sumber
2
Maaf tapi menggunakan argumen PhD di sini seperti mengatakan Anda harus memiliki $ 300 pisau dapur untuk menjadi koki yang baik. Bahkan Simon Peyton Jones - ayah Haskell - tidak memiliki gelar PhD. Praktek dan ketekunan adalah apa yang mengarah pada keahlian baik di sini maupun di bidang lain mana pun.
Petras Purlys