Pertanyaan Memulai dengan Haskell


Selama beberapa hari saya mencoba membungkus kepala saya di sekitar paradigma pemrograman fungsional di Haskell. Saya telah melakukan ini dengan membaca tutorial dan menonton screencasts, tetapi tampaknya tidak ada yang benar-benar cocok. Sekarang, dalam mempelajari berbagai bahasa imperatif / OO (seperti C, Java, PHP), latihan adalah cara yang baik bagi saya untuk pergi. Tetapi karena saya tidak benar-benar tahu apa yang dimiliki Haskell dan karena ada banyak konsep baru untuk digunakan, saya belum tahu dari mana harus memulai.

Jadi, bagaimana Anda belajar Haskell? Apa yang membuat Anda benar-benar "memecahkan es"? Juga, ide bagus apa pun untuk memulai latihan?


758


asal


Jawaban:


Saya akan memesan panduan ini dengan tingkat keterampilan yang Anda miliki dalam haskell, pergi dari pemula mutlak sampai ke ahli. Perhatikan bahwa proses ini akan memakan waktu berbulan-bulan (bertahun-tahun?), Jadi agak panjang.

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 pun 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 daftar program proses adalah kandidat yang baik untuk ini, karena mereka hanya membutuhkan pengetahuan haskell paling dasar untuk dapat menulis.

Pertama, beberapa panduan bagus untuk mempelajari dasar-dasar haskell adalah selamat belajar tutorial haskell dan 6 bab pertama dari belajar kamu haskell. Saat membaca ini, itu adalah ide yang sangat bagus untuk juga memecahkan masalah sederhana dengan apa yang Anda ketahui.

Dua sumber daya lainnya adalah Haskell Programming dari prinsip pertama, dan Pemrograman di Haskell. Mereka berdua datang dengan latihan untuk setiap bab, jadi Anda memiliki masalah sederhana kecil yang cocok dengan apa yang Anda pelajari pada beberapa halaman terakhir.

Daftar masalah yang bagus untuk dicoba adalah halaman haskell 99 masalah. Ini mulai sangat mendasar, dan menjadi lebih sulit saat Anda melanjutkan. Ini adalah praktik yang sangat baik dalam melakukan banyak hal, karena memungkinkan Anda melatih keterampilan Anda dalam rekursi dan fungsi urutan yang lebih tinggi. Saya akan merekomendasikan melewatkan setiap masalah yang membutuhkan keacakan karena itu sedikit lebih sulit dalam haskell. Memeriksa pertanyaan SO ini jika Anda ingin menguji solusi Anda dengan QuickCheck (lihat Menengah di bawah).

Setelah Anda melakukan beberapa dari mereka, Anda dapat melanjutkan dengan melakukan beberapa dari itu Proyek Euler masalah. Ini diurutkan berdasarkan berapa banyak orang yang telah menyelesaikannya, yang merupakan indikasi kesulitan yang cukup baik. Tes ini logika Anda dan haskell lebih dari masalah sebelumnya, tetapi Anda masih harus dapat melakukan beberapa yang pertama. Keuntungan besar haskell dengan masalah ini adalah Integer tidak terbatas dalam ukuran. Untuk menyelesaikan beberapa masalah ini, akan berguna untuk membaca bab 7 dan 8 untuk mempelajari Anda tentang haskell juga.

Pemula

Setelah itu Anda harus memiliki pegangan yang cukup baik pada rekursi dan fungsi urutan yang lebih tinggi, jadi itu akan menjadi saat yang tepat untuk mulai melakukan beberapa masalah dunia nyata. Tempat yang sangat bagus untuk memulai adalah Dunia Nyata Haskell (buku online, Anda juga dapat membeli salinan cetak). Saya menemukan beberapa bab pertama memperkenalkan terlalu banyak terlalu cepat untuk seseorang yang belum pernah melakukan pemrograman fungsional / menggunakan rekursi sebelumnya. Namun dengan latihan yang akan Anda lakukan dari melakukan masalah sebelumnya, Anda harus menemukannya sangat bisa dimengerti.

Menangani masalah dalam buku adalah cara yang bagus untuk mempelajari cara mengelola abstraksi dan membangun komponen yang dapat digunakan kembali dalam haskell. Ini penting bagi orang yang terbiasa dengan pemrograman berorientasi objek (oo), karena metode abstraksi oo yang normal (kelas oo) tidak muncul di haskell (haskell memiliki kelas tipe, tetapi mereka sangat berbeda dengan kelas, lebih mirip oo interface ). Saya tidak berpikir itu adalah ide yang bagus untuk melompati bab-bab, karena masing-masing memperkenalkan banyak ide baru yang digunakan dalam bab-bab selanjutnya.

Setelah beberapa saat Anda akan sampai ke bab 14, bab monads yang ditakuti (dum dum dummmm). Hampir semua orang yang belajar haskell memiliki kesulitan memahami monad, karena betapa abstraknya konsep ini. Saya tidak bisa memikirkan konsep apa pun dalam bahasa lain yang sama abstraknya dengan monads dalam pemrograman fungsional. Monads memungkinkan banyak ide (seperti operasi IO, perhitungan yang mungkin gagal, parsing, ...) disatukan di bawah satu ide. Jadi jangan merasa putus asa jika setelah membaca bab monad Anda tidak benar-benar memahaminya. Saya merasa berguna untuk membaca banyak penjelasan yang berbeda tentang monads; masing-masing memberikan perspektif baru tentang masalah. Ini sangat bagus daftar tutorial monad. Saya sangat merekomendasikan Semua Tentang Monads, tetapi yang lain juga bagus.

Juga, diperlukan beberapa saat untuk konsep untuk benar-benar tenggelam. Ini datang melalui penggunaan, tetapi juga melalui waktu. Saya menemukan bahwa terkadang tidur pada masalah membantu lebih dari yang lain! Akhirnya, ide itu akan diklik, dan Anda akan bertanya-tanya mengapa Anda berjuang untuk memahami konsep yang dalam 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 tipe Haskell dengan sempurna, Anda harus mencoba menyelesaikannya 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 daftar kertas ditutupi dengan panah, unicorn, sosis dan pisang berbulu.

Menengah

Setelah Anda memahami Monads, saya pikir Anda telah membuat transisi dari programmer haskell pemula menjadi haskeller menengah. Jadi kemana harus pergi dari sini? Hal pertama yang saya sarankan (jika Anda belum mempelajarinya dari belajar monads) adalah berbagai jenis monads, seperti Reader, Writer dan State. Sekali lagi, haskell dunia nyata dan Semua tentang monads memberikan liputan yang bagus tentang ini. Untuk menyelesaikan pelatihan pelatihan Anda tentang monad transformer adalah suatu keharusan. Ini memungkinkan Anda menggabungkan berbagai jenis Monad (seperti Reader dan State monad) menjadi satu. Ini mungkin tampak tidak berguna untuk memulai, tetapi setelah menggunakannya untuk sementara waktu Anda akan bertanya-tanya bagaimana Anda hidup tanpa mereka.

Sekarang Anda bisa menyelesaikan buku haskell dunia nyata jika Anda mau. Melewatkan bab sekarang meskipun tidak terlalu penting, selama Anda memiliki monads down tepuk. Cukup pilih apa yang Anda minati.

Dengan pengetahuan yang Anda miliki sekarang, Anda harus dapat menggunakan sebagian besar paket pada komplotan rahasia (baik yang didokumentasikan setidaknya ...), serta sebagian besar perpustakaan yang datang dengan haskell. Daftar pustaka yang menarik untuk dicoba adalah:

  • Parsec: untuk memparse program dan teks. Jauh lebih baik daripada menggunakan regexps. Dokumentasi yang bagus, juga memiliki bab haskell dunia nyata.

  • Pemeriksaan cepat: 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 panduan online.

  • HUnit: Pengujian unit dalam haskell.

  • gtk2hs: Kerangka gui paling populer untuk haskell, memungkinkan Anda menulis aplikasi gtk di haskell.

  • happstack: Kerangka pengembangan web untuk haskell. Tidak menggunakan database, bukan toko jenis data. Dokumen yang cukup bagus (kerangka kerja populer lainnya akan menjadi jepret dan yaod).

Juga, ada banyak konsep (seperti konsep Monad) yang akhirnya harus Anda pelajari. Ini akan lebih mudah daripada belajar Monads untuk pertama kalinya, karena otak Anda akan terbiasa dengan tingkat abstraksi yang terlibat. Gambaran yang sangat bagus untuk belajar tentang konsep tingkat tinggi ini dan bagaimana mereka cocok bersama adalah Typeclassopedia.

  • Applicative: Sebuah antarmuka seperti Monads, tetapi kurang kuat. Setiap Monad adalah Aplikatif, tetapi tidak sebaliknya. Ini berguna karena ada beberapa jenis yang Applicative tetapi bukan Monads. Juga, kode yang ditulis menggunakan fungsi-fungsi Applicative sering lebih mudah disusun daripada menulis kode yang setara menggunakan fungsi Monad. Lihat Functors, Applicative Functors dan Monoids dari belajar Anda panduan haskell.

  • Dilipat,Dapat dilalui: Typeclasses yang abstrak banyak dari operasi daftar, sehingga fungsi yang sama dapat diterapkan ke jenis kontainer lainnya. Lihat juga haskell wiki explaination.

  • Monoid: A Monoid adalah tipe yang memiliki nilai nol (atau mempty), dan operasi, dinotasikan <> yang bergabung dengan dua monoid bersama-sama, seperti itu x <> mempty = mempty <> x = x dan x <> (y <> z) = (x <> y) <> z. Ini disebut hukum identitas dan asosiatif. Banyak tipe adalah Monoids, seperti angka, dengan mempty = 0 dan <> = +. Ini berguna dalam banyak situasi.

  • Panah: Panah adalah cara merepresentasikan komputasi yang mengambil input dan mengembalikan output. Fungsi adalah jenis panah paling dasar, tetapi ada banyak jenis lainnya. Perpustakaan juga memiliki banyak fungsi yang sangat berguna untuk memanipulasi panah - mereka sangat berguna bahkan jika hanya digunakan dengan fungsi haskell lama biasa.

  • Array: berbagai array yang dapat berubah / berubah dalam haskell.

  • ST Monad: memungkinkan Anda menulis kode dengan keadaan 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 untuk menulis 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, haskell wikibook, situs haskellwiki.org dan dokumentasi ghc.

  • Kelas jenis multiparameter / dependensi fungsional
  • Ketik keluarga
  • Tipe yang dikuantifikasi secara eksponensial
  • Tipe phantom
  • GADTS
  • yang lain ...

Banyak haskell berbasis di sekitar teori kategori, jadi Anda mungkin ingin memeriksanya. Titik awal yang bagus adalah Teori Kategori untuk Ilmuwan Komputer. Jika Anda tidak ingin membeli buku itu, penulisnya terkait artikel juga sangat baik.

Akhirnya Anda akan 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 pustaka dan konsep baru ini, sangat berguna untuk menulis proyek berukuran sedang di haskell. Ini bisa berupa apa saja (misalnya permainan kecil, penganalisis data, situs web, penyusun). Mengerjakan ini akan memungkinkan Anda untuk menerapkan banyak hal yang sekarang Anda pelajari. Anda tinggal di level ini untuk usia (ini adalah tempat saya berada).

Ahli

Ini akan membawa Anda bertahun-tahun untuk sampai ke tahap ini (halo dari 2009!), Tetapi dari sini saya rasa Anda mulai menulis makalah phd, ekstensi ghc baru, dan datang dengan abstraksi baru.

Mendapatkan bantuan

Akhirnya, ketika sedang belajar, ada banyak tempat untuk mendapatkan informasi. Ini adalah:

  • saluran #haskell irc
  • itu Daftar surat. Ini layak untuk mendaftar hanya untuk membaca diskusi yang berlangsung - beberapa sangat menarik.
  • tempat lain yang terdaftar di halaman rumah haskell.org

Kesimpulan

Nah ini ternyata lebih lama dari yang saya harapkan ... Pokoknya, saya pikir itu adalah ide yang sangat bagus untuk menjadi mahir dalam haskell. Butuh waktu lama, tetapi itu terutama karena Anda belajar cara berpikir yang benar-benar baru dengan melakukan hal itu. 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 pembelajaran haskell, karena saya melihat banyak cara baru untuk mengabstraksikan ide.


2318



Beberapa rekan saya memiliki pengalaman yang baik Mempelajari Anda, Haskell untuk Kebaikan Luar Biasa!.

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

Dan periksa jawabannya sini terlalu


170



Ini adalah buku bagus yang bisa Anda baca online: Dunia Nyata Haskell

Sebagian besar program Haskell yang telah saya lakukan adalah menyelesaikannya Proyek Euler masalah.

Sekali nasihat yang saya baca beberapa waktu yang lalu adalah bahwa Anda harus memiliki serangkaian masalah sederhana yang Anda tahu bagaimana memecahkannya (dalam teori) dan kemudian kapan pun Anda mencoba mempelajari bahasa baru, Anda mengimplementasikan masalah-masalah itu dalam bahasa itu.


98



Saya menikmati menonton seri 13 episode ini di Pemrograman Fungsional menggunakan Haskell.

C9 Ceramah: Dr. Erik Meijer - Dasar-Dasar Pemrograman Fungsional: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/


70



Untuk menambah jawaban orang lain - ada satu yang berguna yang akan membantu Anda ketika mengkodekan (misalnya ketika memecahkan masalah proyek Euler): Hoogle. Anda dapat menggunakan antarmuka baris perintah atau antarmuka web.

Garis komando

Setelah Anda menginstal platform Haskell pastikan untuk cabal install hoogle

Contoh penggunaan Hoogle:

Anda memiliki fungsi f x = 3 * x + 1 dan Anda ingin menerapkannya (5 :: Int), kemudian menerapkannya pada hasil dan pada hasil itu dan seterusnya dan dapatkan daftar tak terbatas dari nilai-nilai itu. Anda mencurigai ada kemungkinan ada fungsi untuk membantu Anda (tidak khusus untuk Anda f meskipun).

Fungsi itu akan menjadi tipe (a -> a) -> a -> [a] jika dibutuhkan f 5 atau a -> (a -> a) -> [a] jika dibutuhkan 5 f (kami menganggap fungsi ini 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 dipanggil iterate. Anda menggunakannya oleh iterate func 5!

Antarmuka web

Hasilnya untuk contoh yang sama dapat ditemukan sini.


64



Graham Hutton Pemrograman di Haskell Singkat, cukup cermat, dan tahun-tahun pengajarannya benar-benar ditunjukkan Haskell. Hampir selalu apa yang saya sarankan orang mulai dengan, terlepas dari mana Anda pergi dari sana.

Secara khusus, Bab 8 ("Parser Fungsional") memberikan dasar nyata yang Anda butuhkan untuk mulai berurusan dengan monads, dan saya pikir sejauh ini adalah tempat terbaik untuk memulai, diikuti oleh Semua Tentang Monads. (Berkenaan dengan bab itu, meskipun, perhatikan errata dari situs web, namun: Anda tidak dapat menggunakan do bentuk tanpa bantuan khusus. Anda mungkin ingin belajar tentang typeclasses terlebih dahulu dan menyelesaikan masalah itu sendiri.)

Hal ini jarang ditekankan kepada pemula Haskell, tetapi ada baiknya belajar sejak awal bukan hanya tentang menggunakan monads, tetapi tentang membangun monad Anda sendiri. Ini tidak sulit, dan yang disesuaikan dapat membuat sejumlah tugas lebih sederhana.


53



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


49



Saya akan menyarankan bergabung dengan Saluran irc #haskelldan bertanya di sana. Begitulah cara saya belajar Haskell. Jika Anda melalui Real World Haskell seperti yang disarankan di atas, jawaban waktu nyata untuk pertanyaan Anda akan sangat membantu. Banyak orang pintar di #haskell menulis Haskell untuk bersenang-senang dan mencari untung, jadi Anda akan mendapat banyak masukan yang bagus. Cobalah!


30



Ini adalah favorit saya

Haskell: Pemrograman Fungsional dengan Tipe

Joeri van Eekelen, et al. | Wikibooks
       Published in 2012, 597 pages

Dunia Nyata Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages

22



Saya juga dapat merekomendasikan Namun Tutorial Haskell lain sebagai pengantar.

Sumber pembelajaran lain yang baik (mungkin pada tingkat menengah), yang telah banyak membantu saya dan belum disebutkan dalam jawaban lain sejauh yang saya lihat, adalah Brent Yorgey Typeclassopedia, yang dapat ditemukan di The Monad Reader (Edisi 13) 

Ini ditulis dalam gaya yang sangat mudah diakses dan berisi (di antara banyak hal lainnya), saran pengantar berikut:

Ada dua kunci dari kebijaksanaan hacker Haskell yang ahli:

  1. Pahami jenisnya.

  2. Dapatkan intuisi yang mendalam untuk setiap jenis kelas dan hubungannya dengan yang lain   kelas jenis, didukung oleh keakraban dengan banyak contoh.

The Monad Reader itu sendiri adalah harta karun mutlak bagi programmer fungsional (tidak hanya Haskell programmer).


18