Haskell AND Lisp vs. Haskell OR Lisp [ditutup]

40

Saat ini saya kode dengan C, C ++, dan Python. Saya ingin mengambil bahasa pemrograman fungsional, dan sekarang saya condong ke arah Haskell. Saya TIDAK ingin memulai perang "Haskell vs Lisp" di sini; yang ingin saya ketahui adalah ini: jika saya mempelajari Haskell terutama untuk paparan pemrograman fungsional, apa manfaatnya, jika ada, yang akan saya peroleh dari pembelajaran Lisp nanti?

Zeke
sumber
1
Dan F # dan Clojure.
cnd

Jawaban:

58

Saya sarankan belajar keduanya, Haskell pertama, kemudian Common Lisp. Pengalaman saya dengan Haskell pada awalnya adalah pengetikan statis tampaknya menjadi gangguan yang membatasi, tetapi begitu saya terbiasa, saya perhatikan bahwa sebagian besar kesalahan ketik saya memiliki kesalahan logika yang bersembunyi di belakang mereka. Ketika Anda sampai pada titik ini, dan tonggak sejarah berikutnya, yang belajar untuk berpikir dalam tipe dan mendefinisikan tipe Anda sendiri sebagai sarana untuk mengekspresikan solusi Anda, Anda akan siap untuk Common Lisp.

Dengan Common Lisp, Anda dapat menambahkan monad, kari, dan semua yang Anda suka dari Haskell, tetapi Anda juga mendapatkan banyak warisan seperti yang disebutkan Frank Shearar, dan fungsi generik dengan beberapa pengiriman, dan sistem penanganan pengecualian canggih.

Jadi mengapa tidak belajar Common Lisp dulu saja? Berasal dari latar belakang prosedural dan OOP, pengalaman saya adalah bahwa saya tidak benar-benar mengerti pemrograman fungsional sampai saya harus menggunakannya secara eksklusif. Setelah pemrograman fungsional nyaman, Anda dapat menambahkan sisa alat yang disediakan Common Lisp, dan menggunakan alat apa pun yang terbaik untuk mengerjakan tugas yang ada.

Larry Coleman
sumber
6
Saya pikir Anda berhasil - apa yang membuat Haskell dan Smalltalk sangat berguna untuk belajar adalah kemurnian mereka.
Frank Shearar
4
Saya setuju dengan kemurnian membuat belajar bahasa jauh lebih mudah. Saya tidak dapat memahami bahasa fungsional itu sendiri dengan LISP karena semuanya mungkin dalam bahasa dan saya memiliki terlalu banyak keharusan, latar belakang OO. Namun dalam Haskell, tidak ada konsep yang mengganggu pembelajaran.
Eonil
1
Ini lucu, saya punya pengalaman sebaliknya. Saya mengambil poin utama pemrograman fungsional melalui Skema, bahasa pertama saya. Saya kadang-kadang meretas Haskell dan saya pasti menemukan bahwa saya harus mempelajari kembali + lebih dari hal-hal yang saya tahu setiap kali saya meninggalkan Haskell untuk sementara waktu. Yang sedang berkata, Haskell adalah bahasa yang sangat kaya, dengan sejumlah besar untuk mengajar Anda (sangat paksa.) Jenis Jenis Jenis Jenis! Ikuti tipenya!
Josh Infiesto
31

Dan tolong.

Haskell mengajarimu yang paling murni dari FP, sejauh yang aku tahu, seperti halnya Smalltalk mengajarkan yang paling murni dari OO. (Saya menyebutkan ini bukan untuk menyarankan bahwa OO dan FP tidak bisa menikah, tetapi karena kedua bahasa ini adalah bahasa "permata" - sebuah ide inti yang dibawa ke ekstrem.)

Lisp benar-benar keluarga bahasa, jadi saya akan berbicara tentang Common Lisp karena itulah anggota keluarga tertentu yang saya gunakan.

Lisp masih akan memiliki banyak hal untuk diajarkan kepada Anda:

  • Ini multi -paradigma , jadi seperti yang ditunjukkan dsimcha itu akan menunjukkan kepada Anda bagaimana mengintegrasikan FP dengan paradigma lain.
  • Lisp akan mengajarkan Anda bahwa "code-is-data, data-is-code", misalnya melalui makro.
  • CLOS adalah merek OO yang sangat menarik, dengan banyak pewarisan yang berfungsi, dan fungsi generik.
Frank Shearar
sumber
11

Belajar Lisp nantinya akan memungkinkan Anda untuk menyesuaikan Emacs yang bisa dibilang adalah editor teks paling canggih yang tersedia. Anda tidak dapat melakukannya di Haskell.


sumber
14
[Mempertajam tanda kurung]
Inaimathi
6
Mungkin seseorang dapat menulis editor teks untuk itu. Saya mendengar sistem operasi Emacs tidak datang dengan satu. (Saya Nak. Saya tahu Anda bisa mendapatkan mode Viper. :)
greyfade
14
Sebenarnya, ada klon Emacs yang disebut Yi, yang menggunakan Haskell dengan cara yang persis sama seperti Emacs menggunakan Lisp. Bahkan, dibandingkan dengan (GNU) Emacs, Yi bahkan lebih murni, karena kernelnya juga ditulis dalam Haskell, sedangkan kernel Emacs umumnya cenderung tidak ditulis dalam Lisp. Kernel GNU Emacs ditulis dalam C, JEmacs 'ditulis dalam Java, misalnya.
Jörg W Mittag
2
@ Jorg, jika ini adalah implementasi sebagian dan bukan tiruan penuh dari GNU Emacs atau XEmacs, itu bukan hal yang sama. Mirip dengan membandingkan Word ke Wordpad atau Notepad.
1
@ Thorbjørn Ravn Andersen: Ya, tapi tidak cukup itu buruk. :)
greyfade
11

Haskell dan Lisp adalah dua binatang yang sama sekali berbeda.

Haskell adalah kindof "pemrograman fungsional murni di menara gading"

Lisp adalah kindof "code-is-data / data-is-code / buat konstruksi bahasa Anda sendiri". Anda dapat memanipulasi kode Anda dengan cara apa pun yang dapat Anda bayangkan.

Mereka sangat berbeda. Keduanya berbagi aspek "pemrograman fungsional", tapi itu benar-benar titik kecil yang sama dibandingkan dengan perbedaan mereka. Coba saja dan Anda akan melihat betapa berbedanya mereka!

dagnelies
sumber
+1: Poin bagus. Saya tahu beberapa Haskell dan beberapa Lisp. Meskipun saya bukan ahli dalam keduanya, saya pikir Anda benar bahwa mereka sangat berbeda. Di Haskell Anda tidak memiliki gagasan untuk menggunakan data sebagai kode. Dalam Lisp Anda tidak memiliki pencocokan pola (AFAIK). Mungkin daftar (!) Perbedaan lebih panjang.
Giorgio
7

Manfaat utama yang saya lihat dari belajar Lisp adalah belajar bagaimana mengintegrasikan FP ke dalam bahasa multi-paradigma yang berorientasi dunia nyata, daripada hanya mempelajarinya dalam konteks bahasa akademik yang menekankan kemurnian.

dsimcha
sumber
5
Saya kira Anda memang menginginkan perang "Haskell vs Lisp"!
Don Roby
3
Haskell adalah bahasa akademik yang menekankan kemurnian ... dan banyak orang menggunakannya di dunia nyata. Smalltalk ada di kamp itu juga.
Frank Shearar
Banyak orang menggunakan Haskell di dunia nyata?
Jon Harrop
1
@ Jon Harrop: Ya, saya menggunakan Haskell di dunia nyata (dan berfungsi dengan sangat baik untuk aplikasi tertentu), mungkin saya salah satu dari sedikit (?)
Giorgio
5

Saya juga berasal dari latar belakang C / C ++ / Python dan telah mencoba FP beberapa kali dalam beberapa tahun terakhir. Awalnya saya melihat Haskell dan tidak bisa membuat kepala atau ekor, kemudian mencoba Ocaml tetapi tidak mendapatkan lebih jauh dengan itu. Akhirnya saya mulai mendengar hal-hal baik tentang Scala, mencobanya, dan menemukan itu sangat cocok untuk saya (saya juga pernah melakukan sedikit Jawa di masa lalu), sampai-sampai setelah setahun berkecimpung di Scala (dan mengirim 161) Project Euler bermasalah dengan itu), Haskell tampaknya jauh lebih masuk akal. Sebenarnya saya hanya memesan beberapa buku tentang Haskell dan ingin mencoba lagi, walaupun ini sebagian besar dimotivasi oleh keberadaan Scalaz.

Jadi saya menemukan menggunakan bahasa multi-paradigma (yaitu Scala, tetapi Lisp mungkin akan cocok dengan tagihan juga) cara yang baik untuk FP. Tetapi jika Anda senang menyelam ke Haskell (saya tidak), lakukanlah.

timday
sumber
Menarik bahwa Anda lebih jauh dengan Scala daripada OCaml. Bagaimana bisa?
Jon Harrop
@ Jon: Pertanyaan bagus; sulit untuk dikatakan. Mungkin saya belum siap untuk "masuk ke" fungsional pada saat itu. Mungkin saya kebetulan menemukan tutorial Scala yang berada di level yang tepat. Mungkin silsilah C / C ++ / Scala dari Scala membuatnya sedikit lebih asing. Mengingat setiap taruhan rasional akhir-akhir ini akan menggunakan F # daripada Scala, saya mungkin akan mengunjungi kembali domain OCaml di beberapa titik, meskipun karena saya mencoba-coba hal ini hanya karena kegembiraan semata-mata karena masuk ke "pola pikir pemrograman" yang berbeda dengan C ++ saya Dayjob, saya memiliki kecenderungan jahat untuk mencoba lagi Haskell berikutnya.
timday
Pendekatan bergerak mulus :)
Eonil
2

Saya awalnya berasal dari latar belakang C / C ++ / Ruby dan saya menggunakan konsep FP di Ruby kapan pun saya bisa. Keadaan hanya agak melukai otak saya. Salah satu teman saya menelepon saya pada suatu hari, dan dia meminta saya untuk menulis sesuatu di Haskell (pertama saya - dan semoga tidak bertahan lama - pekerjaan Haskell!). Saya cepat belajar bahasa dan saya mengumpulkan sesuatu yang berhasil. Itu tidak cantik atau apa pun, tetapi berhasil.

Saya mengambil cuti sebulan dari Haskell karena saya tidak punya apa-apa untuk menggunakannya. Tetapi ketika saya memutuskan untuk menulis perangkat lunak blog saya sendiri, saya menggunakan Haskell ( https://symer.io ). Haskell sangat keren karena Anda dapat memecahkan masalah menjadi beberapa bagian dan mengimplementasikan bagian-bagian ini secara berbeda berdasarkan input. Haskell juga menangani kegagalan dengan sangat baik melalui nilai-nilai tinju yang cerdas. Ada begitu banyak alat untuk bekerja dengan kotak-kotak ini sehingga Anda lupa bahwa kotak itu ada.

Pengalaman saya dengan lisp (Skema) benar-benar negatif. Tidak hanya bahasanya tidak memiliki perangkat yang cerdas dan sederhana ini, rasanya juga sama berbahayanya dengan Ruby atau JavaScript. Itu adalah pengalaman yang mengerikan dan tidak menawarkan sesuatu yang baru di luar Ruby atau Python.

C ++ tidak dapat menampung lilin di Haskell, di luar manajemen memori. Haskell sama cepat (jika tidak lebih cepat), secara signifikan lebih singkat, dan jauh lebih aman. Tapi keamanan Haskell tidak pernah menghalangi.

TL; TR Haskell menghirup udara segar, dan Lisp adalah Ruby yang sedikit lebih fungsional.

Nate Symer
sumber