Skema vs Haskell untuk Pengantar Pemrograman Fungsional?

36

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.

Haziz
sumber
3
Jangan lupaReal World Haskell
alternatif
15
Komentar sampingan kecil: kalkulus lambda adalah sistem yang luar biasa sederhana; hal yang keren tentang itu bukanlah kompleks, tetapi sebaliknya; Anda dapat mengekspresikan semua yang Anda inginkan dalam sistem yang sederhana. Mulai dengan bahasa pemrograman; sekarang membuang SEMUANYA kecuali referensi variabel, definisi fungsi, dan panggilan fungsi. Voila! Kalkulus Lambda.
9
Saya bisa mengajari Anda kalkulus lambda dalam lima menit. Sekarang, memahami konsekuensi dari apa yang baru Anda pelajari membutuhkan seumur hidup. :)
5
Saya memilih Haskell daripada Skema terutama karena tidak memiliki banyak kurung terkutuk!
Joey Adams

Jawaban:

27

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.

Robert Harvey
sumber
3
Terima kasih telah mendorong saya ke arah OCaml, dan ya saya akan mengambil risiko jiwaku dan menjelajahi F #. Saya mengembangkan untuk Linux, Mac OS X dan Windows (terutama yang pertama) tetapi FSI tampaknya tersedia untuk ketiga platform (menjalankan mono di Linux dan Mac OS X) yang sudah saya lakukan. Fakta bahwa bobot penuh Microsoft berada di belakang bahasa pemrograman fungsional (meskipun bahasa "tidak murni"), harus disambut daripada dikecam oleh penggemar pemrograman fungsional.
haziz
SML sudah mati, ocaml ada untuk menulis coq
permeakra
1
+1 untuk ML; lebih jelas dari pada Haskell.
m3th0dman
Saya juga menemukan ide yang bagus untuk belajar SML atau OCaml, kemudian Haskell (+1). Setelah mengetahui bahasa-bahasa ini, mengambil yang lain (mis. Scala) sangat mudah. Selain itu orang dapat melihat Skema, Common Lisp dan Clojure (dalam urutan ini), untuk memiliki perasaan bahasa dinamis.
Giorgio
@haziz: Bahkan ketika mereka membuat perangkat lunak yang baik, Microsoft (atau, dalam hal ini, Oracle, dll) tetap menjadi perusahaan monopoli, dengan semua praktik buruk yang terlibat seperti penguncian pelanggan, format yang tidak kompatibel, implementasi yang tidak kompatibel, dll.
Giorgio
26

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 .

Hoa Long Tam
sumber
4
"Sintaksnya lebih mudah dipelajari dan dibaca" sangat subjektif.
6
@luqui: Benar. Mungkin 'biasa' adalah kata yang lebih baik. Tidak ada masalah backtick, infixes, presedensi, atau asosiatif --- hanya tanda kurung, banyak tanda kurung infernal, konyol.
Hoa Long Tam
17

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.

DaveGauer
sumber
17

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

Marc
sumber
6

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

Eli Barzilay
sumber
6

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
Terima kasih telah mendorong saya ke arah ML / OCaml, dan ya saya akan "mengambil risiko jiwaku" dan menjelajahi F #. Saya mengembangkan untuk Linux, Mac OS X dan Windows (terutama yang pertama) tetapi FSI tampaknya tersedia untuk ketiga platform (menjalankan mono di Linux dan Mac OS X) yang sudah saya lakukan. Fakta bahwa bobot penuh Microsoft berada di belakang bahasa pemrograman fungsional (meskipun bahasa "tidak murni"), harus disambut daripada dikecam oleh penggemar pemrograman fungsional.
haziz
BTW saya memesan The Little MLer dari Amazon dan sudah menerimanya dan memulai Perjalanan saya. Saya juga baru saja menambahkan Belajar F # ke perpustakaan saya. Tampaknya menjadi panduan pengajaran yang lebih umum, yang akan saya gunakan untuk melengkapi The Little MLer.
haziz
6

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.

John F. Miller
sumber
Saya sebenarnya menggunakan wiki / pdf ini untuk mempelajari Haskell dan memoles keterampilan OCaml saya (dengan menerjemahkan Haskell idiomatis ke OCaml). Akan sangat keren jika seseorang bisa mengambil materi ini dan "bercabang" untuk beberapa bahasa fungsional. Bisa menjadi dasar untuk baku tembak bahasa fungsional yang cukup keren!
Marc
1
Masalah utama dengan ini adalah bahwa ia memperkenalkan parsec tanpa memperkenalkan monads.
alternatif
@Alternative parsec memiliki antarmuka Monadic, tetapi juga memiliki antarmuka Applicative, belum lagi berbagai fungsi lainnya. Bukannya tidak masuk akal untuk memperkenalkan Parsec sebelum generalisasi monadik
Philip JF
4

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.

alternatif
sumber
3
"cukup banyak memeriksa bahwa kode Anda benar" sangat salah. Tidak ada sistem tipe yang dapat melakukannya. (Kecuali jika sistem tipe Anda adalah teorema teorema nyata.)
Eli Barzilay
4
@Eli, sudahkah Anda menggunakan Haskell? Meskipun secara teori pernyataan ini jelas salah, dalam praktiknya saya merasa itu cukup akurat, setidaknya dibandingkan dengan setiap bahasa lain yang saya gunakan. Yang mengatakan, saya sebenarnya tidak setuju bahwa ini adalah properti yang bagus untuk pemula. Ketika saya mempelajari tali, saya lebih suka melihat secara spesifik kesalahan kode saya, daripada meminta kompiler berteriak kepada saya bahwa itu salah dan harus bertarung dengannya ketika saya bahkan tidak tahu kosa kata yang digunakan oleh pesan kesalahan.
1
@Eli "cukup banyak" adalah istilah kunci di sini. Di Haskell Anda menghabiskan lebih banyak waktu untuk memikirkan bagaimana mengimplementasikannya, maka implementasinya datang dengan mudah. Kemudian Anda ketikkan centang untuk memastikan peta, lipatan, dll Anda waras.
alternatif
@Eli Barzilay: Sistem tipe Haskell sepertinya sangat dekat dengan teorema. Itu tentu menciptakan lingkungan di mana teorema membuktikan hampir tampak lebih umum daripada alat lainnya. (Bukannya saya menyiratkan hubungan kausal.)
greyfade
@luqui - Ya, saya menggunakannya; tidak, itu masih pernyataan yang salah, baik dalam praktik maupun secara teori. Itu bukan sesuatu yang unik bagi Haskell.
Eli Barzilay
1

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.

autodidakto
sumber
0

Jika tidak murni, Anda mungkin juga menggunakan bahasa imperatif, demikian Haskell.

ular sanca
sumber
0

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.

octopusgrabbus
sumber
-2

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.

varreli
sumber