Saya merasa nyaman dengan pemrograman dalam C dan C #, dan akan mengeksplorasi C ++ di masa depan. Saya mungkin tertarik mengeksplorasi pemrograman fungsional sebagai paradigma pemrograman yang berbeda. Saya melakukan ini untuk bersenang-senang, pekerjaan saya tidak melibatkan pemrograman komputer, dan saya agak terinspirasi oleh penggunaan pemrograman fungsional, yang diajarkan cukup awal, dalam kursus ilmu komputer di perguruan tinggi. Kalkulus Lambda tentu saja di luar kemampuan matematika saya, tetapi saya pikir saya dapat menangani pemrograman fungsional.
Manakah dari Haskell atau Skema yang akan berfungsi sebagai pengantar yang baik untuk pemrograman fungsional? Saya menggunakan emacs sebagai editor teks saya dan ingin dapat mengkonfigurasinya dengan lebih mudah di masa depan yang akan memerlukan pembelajaran Emacs Lisp. Pemahaman saya, bagaimanapun, adalah bahwa Emacs Lisp cukup berbeda dari Skema dan juga lebih prosedural dibandingkan dengan fungsional.
Saya mungkin akan menggunakan buku "The Little Schemer", yang telah saya beli, jika saya mengejar Skema (bagi saya agak aneh dari pembatas terbatas saya melewatinya). Atau akan menggunakan "Pelajari Anda Haskell untuk Kebaikan Besar" jika saya mengejar Haskell. Saya juga akan menonton video Intro to Haskell oleh Dr Erik Meijer di Channel 9.
Setiap saran, umpan balik, atau masukan dihargai.
Terima kasih.
PS BTW Saya juga memiliki akses ke F # karena saya memiliki Visual Studio 2010 yang saya gunakan untuk pengembangan C #, tetapi saya tidak berpikir itu harus menjadi kriteria utama saya untuk memilih bahasa.
Real World Haskell
Jawaban:
Saya akan merekomendasikan OCaml.
Dalam sudut pandang pribadi saya, dasar utama dari pemrograman fungsional modern adalah fungsi tingkat tinggi, sistem tipe statis, dan tipe data aljabar dan pencocokan pola.
Antara Skema, ML dan Haskell, saya akan memilih ML karena saya pikir itu yang paling relevan dengan definisi ini. Skema tidak memiliki pengetikan statis (ada Typed Racket, tetapi ini bukan untuk pemula skema), dan Haskell memiliki terlalu banyak hal lain (monad, evaluasi malas ...) yang, meskipun menarik, dapat mengalihkan perhatian dari basis penting .
SML dan OCaml sama-sama menarik; Saya lebih terbiasa dengan OCaml, dan ia memiliki perasaan yang lebih "praktis" yang baik (tetapi jika Anda benar-benar ingin "praktis" dengan risiko kehilangan jiwa Anda, Anda sebaiknya memilih F #).
Skema dan Haskell juga bahasa yang sangat menarik. Penekanan skema pada makro memang menarik, tetapi tidak terkait langsung dengan pemrograman fungsional (ini adalah hal lain yang harus Anda coba, juga pemrograman logika, bahasa berbasis stack, dan E yang berorientasi pada kemampuan).
Haskell jelas merupakan bahasa yang hebat dan, saya pikir, poin wajib untuk calon ahli pemrograman fungsional. Tetapi karena bahasa inti OCaml dan Haskell sangat mirip (kecuali untuk evaluasi malas yang mengganggu bagi pemula), mudah untuk mempelajari Haskell setelah Anda mengetahui dasar-dasar OCaml. Atau lebih tepatnya, Anda dapat berkonsentrasi pada hal-hal aneh, dan Anda tidak harus mengasimilasi dasar-dasar pada saat yang sama.
Demikian pula, begitu Anda melihat OCaml, dan mungkin juga Haskell, dan masih ingin belajar lebih banyak, Anda harus melihat Coq atau Agda. Namun sedikit yang akan merekomendasikan Coq atau Agda untuk pengenalan pertama untuk pemrograman fungsional ...
Untuk memperjelas poin saya: Saya pikir belajar OCaml (atau SML) maka Haskell akan menjadikan Anda seorang programmer fungsional sebaik mempelajari Haskell secara langsung, tetapi lebih mudah (atau kurang menyakitkan).
Selain itu, OCaml dan Haskell sama-sama memiliki hal-hal baik yang membedakan mereka, dan menarik untuk mengetahui tentang fitur-fitur canggih dari keduanya . Hanya belajar Haskell lebih buruk dalam aspek itu (meskipun tentu saja Anda bisa belajar OCaml setelah Haskell; Saya pikir itu kurang logis dan akan membuat Anda lebih frustrasi).
Untuk mempelajari OCaml, saya akan merekomendasikan draft buku Jason Hickey (PDF) .
¹ definisi ini kontroversial. Beberapa orang Skema akan mengklaim pengetikan statis tidak ada hubungannya dengan pemrograman fungsional. Beberapa orang Haskell akan mengklaim bahwa definisi mereka kemurnian ( "apa Haskell tidak, tapi tidak lebih") adalah sine qua non kondisi untuk menjadi bahasa fungsional. Saya setuju untuk tidak setuju.
sumber
Jika Anda tertarik pada konsep yang lebih maju dalam pemrograman fungsional, maka pergilah dengan Haskell. Ada sistem tipe yang tepat dan larangan ketat terhadap mutasi. Namun, Haskell bukan untuk orang yang lemah hati.
Jika Anda hanya ingin pengantar desain fungsional, gunakan Skema. Sintaksnya lebih mudah dipelajari dan dibaca. Memang memungkinkan pemrograman prosedural, tetapi hanya mendisiplinkan diri Anda untuk tidak menggunakan prosedur apa pun dengan
!
di akhir nama.Dengan Skema, Anda juga dapat membaca Struktur dan Interpretasi Program Komputer , yang merupakan pengantar terbaik untuk paradigma pemrograman, secara langsung. Ada kuliah tentang buku dari MIT dan Berkeley .
sumber
Jawaban yang benar tentu saja keduanya! Jadi itu hanya pertanyaan bahasa mana yang harus ditangani terlebih dahulu. Situasi saya identik dengan Anda. Saya sangat menikmati The Little Schemer. Anda pasti akan memahami konstruksi dasar pemrograman fungsional setelah melewati itu (dan memiliki tempat untuk meletakkan noda jelly Anda!)
Saya sekitar seperempat ke Learn You a Haskell for Great good. Saya menikmati itu juga, tetapi kedua buku itu tidak bisa lebih berbeda. Learn You a Haskell memiliki pendekatan yang sangat tradisional untuk mengajarkan bahasa tertentu. The Little Schemer khusus untuk Scheme, jelas, tetapi jauh lebih peduli dengan pengajaran dasar-dasar pemrograman fungsional, bukan bahasa Skema.
Saya merekomendasikan memulai dengan The Little Schemer. Ini kurang praktis, tetapi lebih mendasar.
sumber
Dua sen saya sehubungan dengan pemrograman fungsional adalah untuk tidak terpaku pada bahasa tertentu, tetapi mempelajari konsep-konsep kunci pemrograman fungsional. Saya belajar pemrograman fungsional dengan cara dilemparkan ke dalam proyek di mana bos saya bersikeras semua pengembangan dilakukan di APL. APL adalah bahasa pengolah array fungsional dan jauh dari LISP, Haskell, atau bahasa pemrograman arus utama lainnya yang Anda bisa dapatkan. Hasil nyata adalah ketika saya menemukan bahwa ketika saya "mengguncang" paradigma pemrograman fungsional dan secara mental belajar bagaimana secara otomatis menguraikan masalah menjadi program fungsional, saya benar-benar tidak lagi terintimidasi oleh aspek idiomatik dari bahasa fungsional lain seperti Haskell, OCaml, Skema, Scala, dan Clojure. SAYA'
Jika saya memilih bahasa fungsional pertama, saya mungkin akan memilih Haskell atau Steel Bank Common Lisp (SBCL). Untuk Haskell, saya akan membaca Learn You a Haskell ... , Dunia Nyata Haskell , Jalan Haskell ke Logika, Matematika dan Pemrograman , dan Mutiara Desain Algoritma Fungsional . Untuk CL, saya pernah membaca Land of Lisp , Paradigma Pemrograman Kecerdasan Buatan , dan (jika Anda benar-benar hardcore) Biarkan Lambda . Anda dapat mencampur dan mencocokkan semua buku-buku itu untuk mendapatkan gambaran luas tentang pendekatan dan konsep pemrograman fungsional praktis.
Saya juga akan mempertimbangkan mempelajari Clojure dan Scala, karena keduanya adalah bahasa fungsional yang sangat baik dan sangat ekspresif dalam hak mereka sendiri (terlepas dari apa yang dikatakan oleh purist FP).
sumber
Saya setuju dengan poin "pelajari keduanya", tetapi ada beberapa poin lagi yang tidak disebutkan sejauh ini. Pertama-tama, jika Anda baru mengenal pemrograman fungsional dan Anda menggunakan Haskell, maka Anda perlu menghadapi beberapa hal baru selain FP: Anda perlu belajar bagaimana hidup di lingkungan yang malas yang dapat mengambil banyak usaha, dan Anda perlu untuk berurusan dengan sistem tipe "nyata" yang bisa sangat jauh dari apa yang Anda gunakan dalam C atau C #.
Skema, OTOH, memang memiliki sintaks yang tampak asing, tetapi tidak ada sistem tipe statis untuk belajar, dan itu adalah bahasa yang ketat sehingga hal-hal lebih akrab. Selain itu, implementasi Skema cenderung sangat lunak - misalnya, Racket menjadikannya ekstrem dan menyediakan varian malas dan yang diketik secara statis. Ini berarti bahwa Anda dapat mulai dengan hal-hal "mudah" dan terbiasa menggunakan bahasa fungsional, dan kemudian Anda dapat mengembangkan diri dan menggunakan varian yang diketik dan yang malas. Mereka seharusnya lebih mudah sekarang, karena Anda dapat berurusan dengan satu fitur pada suatu waktu. Agar jelas, konsepnyaakan menjadi cukup baru sehingga masalah sintaksis akan menjadi kecil dan sebagian besar tidak relevan. Dengan kata lain, setelah Anda mulai masuk ke konsep baru, Anda akan cukup sibuk sehingga sintaks akan hilang begitu saja. (Dan jika Anda benar-benar peduli dengan sintaks, maka sintaksis Haskell adalah sesuatu yang secara pribadi saya anggap sangat elegan - tetapi itu karena itu juga sangat jauh dari sintaks rata-rata C / C # / C ++ Anda.)
Tetapi setelah mengatakan semua itu, saya pikir ada juga poin bagus untuk F # - Anda mengatakan bahwa Anda melakukan ini sebagai hal sampingan, tetapi ketika Anda belajar FP Anda akan segera ingin menggunakan semua hal yang baik itu. Menggunakan F # berarti Anda dapat melakukan lebih banyak hal "nyata" karena mungkin mudah untuk mengatasi masalah yang sama dengan yang Anda hadapi dalam pekerjaan sehari-hari. Idealnya, Anda akan sampai pada titik di mana Anda akan melihat manfaat dari menggunakan itu, katakanlah, C # - dan menggunakannya dalam beberapa proyek. Jadi sementara Anda benar dalam tidak memilih F # hanya karena lebih mudah bagi Anda untuk mengakses, Anda harus mempertimbangkannya karena tidak ada yang lebih baik daripada benar - benar menggunakankonsep-konsep baru ini. Sebaliknya, jika Anda menggunakan Skema atau Haskell dan menganggapnya sebagai bahasa mainan untuk tujuan Anda (bahkan jika Anda tahu bahwa beberapa orang menggunakannya untuk aplikasi nyata), maka Anda tidak akan pernah menganggap masalah FP terlalu serius. [Tapi YMMV, sebagian besar didasarkan pada pengamatan subjektif dan dapat sangat bervariasi dari satu orang ke orang lain.]
sumber
Apakah ada alasan mengapa ML bukan salah satu pilihan Anda? Ada cukup banyak materi pengantar yang tersedia termasuk buku dan handout kursus. Jika Anda suka The Little Schemer Anda mungkin juga menikmati The Little MLer. Akhirnya, Anda dapat dengan mudah melakukan transisi ke F # nanti. (Bukan berarti saya mengetuk Haskell atau Skema - idealnya belajar ketiganya).
Juga, kata peringatan tentang Emacs Lisp. Saya tidak berpikir Haskell atau ML akan mempersiapkan Anda untuk itu. Bahasa Lispy seperti Skema akan membantu tetapi masih ada perbedaan besar misalnya. variabel dengan cakupan dinamis. Ekstensi Emacs, pada dasarnya, cenderung lebih penting daripada fungsional - mereka semua tentang mengubah keadaan editor.
sumber
Tulis sendiri Skema Anda dalam 48 jam (dalam haskell)
Saya sangat merekomendasikan ini. Anda akan belajar Haskell menggunakan masalah nyata dan menarik, dan Anda akan belajar pelajaran skema terbaik dari bermain dengan juru bahasa yang Anda bangun. Jika Anda mengikuti rute ini, simpan beberapa perkenalan Haskell yang bagus di sekitar. Anda akan lebih memahami mereka jika Anda memiliki masalah untuk dipecahkan.
sumber
Saya akan pergi dengan Haskell. Dalam skema, Anda mungkin didorong untuk melakukan hal-hal prosedural, dan sistem tipenya tidak begitu membantu dengan Haskell, yang sangat bagus untuk pemula karena cukup banyak memeriksa bahwa kode Anda benar pada waktu kompilasi.
sumber
Saya pikir mudah terjebak dalam debat tentang bahasa, dan melewatkan intinya. Untuk seseorang yang hanya ingin mempelajari tentang FP, perbedaan antara Ocaml / ML / Skema / Haskell tidak setengah sepenting kenyamanan Anda dengan materi (buku, video, alat) yang Anda gunakan untuk mempelajarinya. Dan apakah Anda memiliki teman atau tidak untuk membantu Anda belajar bahasa tertentu mengalahkan segalanya.
sumber
Jika tidak murni, Anda mungkin juga menggunakan bahasa imperatif, demikian Haskell.
sumber
Di salah satu jawaban yang Anda terima untuk pertanyaan Anda, saya menemukan tautan ini cukup menarik, karena memberi Anda rasa Haskell dan Skema.
Selain tautan bagus itu, berikut saya ambil pertanyaan Anda.
Jika Anda berasal dari latar belakang pemrograman yang penting, Anda mungkin akan berusaha keras untuk mempelajari pemrograman fungsional. Saya akan memastikan bahwa pengalaman belajar tidak kosong. Itu adalah bahwa Anda dapat menerapkannya pada pekerjaan Anda saat ini atau berikutnya atau bahwa itu akan membantu Anda dengan cara lain.
Ada banyak bahasa yang bagus di luar sana. Orang-orang Scala akan memuji bahasa mereka, seperti orang-orang Clojure dan CL. Bahkan Pythonistas mengklaim kemalasan. Orang lain yang menjawab Anda menyarankan ML. Amit Rathore yang menulis Clojure in Action bahkan mungkin menyarankan agar Anda mempelajari Haskell.
Anda menyebutkan Windows dan F #. Apakah itu akan membantu Anda dalam posisi Anda saat ini? Saya tidak tahu apa-apa tentang F #. Apakah cukup fungsional? Saya bertanya, karena IMHO Python memiliki konstruksi fungsional, tetapi tidak seperti pemrograman di Clojure.
Untuk meringkas, pelajari bahasa fungsional yang "benar-benar" fungsional dan dengan demikian masuk akal untuk situasi Anda.
sumber
Dari sudut pandang relatif pemula, saya sarankan tidak memulai dengan SICP jika Anda memutuskan Skema, kecuali matematika Anda cukup matang. Buku dan video diisi dengan seluk-beluk dan sama sekali tidak intuitif untuk seseorang yang memulai.
sumber