Apa keuntungan menggunakan LISP dan Haskell? Apakah mereka akan menjadikan saya programmer yang lebih baik? [Tutup]

41

Saya tahu Lisp dan Haskell masing-masing adalah bahasa pemrograman logika dan fungsional, tetapi apa sebenarnya artinya ini? Bagaimana mereka berbeda dari bahasa lain? Saya pernah mendengar bahwa mempelajari ini akan membuat Anda menjadi programmer yang lebih baik dan meningkatkan logika Anda. Apakah ini benar, dan jika saya belajar Lisp atau Haskell ke tingkat yang kompeten apakah pemrograman saya akan meningkat dan apakah saya akan lebih baik dalam menangani masalah dalam bahasa apa pun? Saya hanya ingin tahu untuk melihat apakah mereka sepadan dengan upaya belajar. Juga apakah bahasa-bahasa ini berguna di bidang-bidang seperti GUI dan grafik atau mereka hanya berguna untuk aplikasi konsol?

Logan545
sumber
36
Menggunakan LISP dan Haskell akan membuat Anda menjadi programmer LISP dan Haskell yang lebih baik, saya jamin itu.
Neil
17
@MasonWheeler saya harus katakan; ada banyak dalam sistem tipe Haskell yang tidak akan Anda temukan dalam bahasa lain, dan makro LISP tidak dapat ditemukan di bahasa mainstream mana pun. Kedua hal ini patut belajar karena mereka tidak membuat Anda programer yang lebih baik dalam bahasa kerja Anda. Setidaknya ini adalah pengalaman saya; Haskell menjadikan saya perusahaan pengembang C # yang lebih baik. Saya tahu teknik untuk menerapkan pemisahan kekhawatiran secara bersih yang tidak akan pernah saya miliki sebaliknya, dan memecahkan masalah akan selamanya lebih mudah bagi saya daripada sebelum saya mempelajari Haskell.
Jimmy Hoffa
6
Erlang adalah bahasa fungsional. Kelinci MQ ditulis dalam bahasa Erlang dan Kelinci digunakan di banyak tempat untuk melakukan banyak pekerjaan berat. Bahasa fungsional mengajarkan Anda untuk berpikir berbeda tentang pemrograman, dan itu alat tambahan yang bagus untuk Anda miliki. Meskipun benar beberapa konsep telah membuatnya menjadi bahasa yang lebih populer (misalnya ekspresi lambda dalam C # dan C ++), Anda masih mendekati pemecahan masalah dengan cara yang sangat berbeda ketika menggunakan bahasa fungsional.
Binary Worrier
8
@MasonWheeler Ada alasan bagus mengapa suatu bahasa mungkin lebih bermanfaat daripada yang lain, tetapi masih belum banyak digunakan. Saya dapat memikirkan banyak hal: basis pengguna yang ada, perubahan yang terlalu radikal, ketika "bagus sudah cukup baik", dan juga ... ketika alat yang lebih baik membutuhkan programmer yang lebih terlatih secara formal. Jadi popularitas bukanlah ukuran kegunaan yang baik .
Andres F.
5
@MasonWheeler Untuk menggunakan analogi, matematika adalah bidang yang sangat berguna dalam kehidupan nyata. Jadi mengapa tidak banyak orang yang mahir dalam matematika? Mengapa banyak orang takut akan hal itu, dan berpikir itu adalah ilmu hitam dan tidak terlalu berguna?
Andres F.

Jawaban:

37

Ini seperti belajar matematika akan meningkatkan kemampuan analitik Anda dan belajar sastra latin / klasik akan meningkatkan keterampilan menulis Anda.

Orang-orang yang merancang bahasa-bahasa itu telah berpikir keras tentang apa artinya menulis suatu program. Dan bahasa-bahasa itu adalah hasil dari penelitian itu.

Yang mengatakan, belajar Java juga akan membuat Anda menjadi programmer yang lebih baik. Dan belajar C. Manfaat nyata berasal dari belajar bahasa dengan filosofi yang berbeda. Maka Anda dapat memiliki pendapat Anda sendiri tentang cara program seharusnya ditulis.

Edit

Saya menyadari jawaban ini tidak begitu berguna bagi orang yang belum belajar haskell dan / atau cadel. Berikut adalah beberapa contoh untuk menjelaskan lebih lanjut apa yang saya maksud

PELAT

Lisp percaya bahwa sintaks harus minimal, dan bahwa semuanya harus berupa daftar atau primitif (Lisp adalah singkatan dari Pemrosesan Daftar). Bahkan program sebagian besar berisi daftar daftar dan simbol lainnya. Lisp memungkinkan Anda untuk memanipulasi program sebagai daftar, dan untuk menghasilkan program baru dengan cepat. Karena itu seluruh code is data and data is codemoto.

Konsekuensi langsungnya adalah bahwa bahasa Lisp memungkinkan Anda untuk menentukan antarmuka apa pun yang Anda inginkan. Contoh yang bagus adalah compojure yang merupakan kerangka web clojure. Inilah tampilan fungsi perutean

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Contoh bagus lainnya adalah kerangka templating cegukan:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Seperti yang Anda lihat, hasilnya sama singkatnya dengan di DSL seperti kumis, tetapi memungkinkan Anda untuk menggunakan fitur bahasa seperti (for [x (range 1 4)] block). Lebih bagus lagi, Anda memiliki semua alat untuk abstrak dan menyusun kode Anda.

Dalam bahasa lain, sintaksisnya lebih kompleks. Anda tidak dapat membaca program Java sebagai banyak daftar. Tetapi dengan menggunakan Lisp, Anda mendapatkan ide yang lebih baik tentang seperti apa tampilan antarmuka yang ideal, dan apa yang ada dalam kode Anda yang dapat disarikan sebagai data. Ini juga membantu Anda untuk melihat bahasa favorit Anda sebagai struktur data besar, dan untuk lebih memahami bahasa semantiknya.

Haskell

Haskell percaya pada pengetikan statis dan kemurnian yang kuat. Fungsi murni seperti fungsi matematika: mereka didefinisikan pada set nilai, dan memetakannya pada set lain. Fungsi tidak memiliki efek samping, dan nilainya tidak berubah. Kemurnian menarik karena itu bukan sesuatu yang bisa dimiliki oleh bahasa multi-paradigma. Bahasa itu murni atau tidak.

Salah satu konsekuensinya adalah bahwa Anda tidak dapat melakukan tindakan IO kapan pun Anda inginkan (haskellers percaya bahwa ini adalah hal yang baik). Tindakan IO didefinisikan sebagai transaksi, yang sendiri merupakan nilai murni. The mainnilai dari program Haskell adalah transaksi IO dijalankan ketika Anda menjalankan program.

Anda harus berurusan dengan aliran data di program Anda secara eksplisit. Anda tidak dapat membuat dua komponen berkomunikasi dengan menulis & membaca hal-hal dalam variabel global. Anda harus membangun dan meneruskan nilai.

Fitur lain yang disebutkan oleh Jimmy Hoffa adalah sistem tipe kaya. Sementara bahasa lain memiliki pengetikan statis, di haskell Anda dapat memiliki hal-hal seperti:

length :: [a] -> Int (berfungsi dari daftar a ke int)

map :: (a -> b) -> [a] -> [b](fungsi yang mengambil a to btransformasi dan daftar a, dan mengembalikan daftar b)

Yang menyenangkan adalah saya tidak perlu menjelaskan apa fungsi sebenarnya yang dilakukan: Anda sudah mengerti perilaku mereka. Terlebih lagi, fungsi dengan tanda tangan itu tidak bisa apa-apa selain menghitung panjang daftar dan memetakan transformasi atas daftar.

Dalam bahasa yang diketik lainnya, hierarki kelas yang dikombinasikan dengan ketidakstabilan membuat berurusan dengan jenis-jenis itu mimpi buruk. Anda harus memahami hal-hal seperti kovarians dan contravariance, yang tidak mungkin dilakukan dengan benar dari perspektif bahasa (yaitu sederhana, kuat, dan aman).

Entah Anda mengambil jalur aman (seperti scala) dan berakhir dengan bahasa yang sangat rumit, atau Anda mengambil jalur sederhana dan mendapatkan sesuatu yang terbatas (google go generics terbatas pada daftar dan peta) atau tidak aman (generik panah yang selalu kovarian).

Dengan menggunakan haskell, Anda terutama belajar tentang manfaat kemurnian, dan cara menulis kode murni.

Simon Bergot
sumber
1
@JimmyHoffa Saya pikir itu benar-benar pantas dijawab sendiri, karena inilah yang cenderung diabaikan oleh orang. Ada domain masalah yang paling baik diselesaikan dengan pemrograman fungsional yang orang bahkan tidak sadari ada sampai mereka setidaknya mencoba-coba di domain tersebut di luar zona nyaman mereka.
KChaloux
2
Saya tidak tahu tentang Majelis, dan saya juga tidak menyebutkannya. Namun perakitan dapat membantu Anda memahami bagaimana program Anda berjalan. Ada posting bagus di SO orang yang mampu menganalisis sepotong perakitan yang dihasilkan untuk menjelaskan masalah kinerja.
Simon Bergot
3
@KChaloux Saya akan menulis jawabannya tetapi pertanyaan ini harus ditutup (saya menutup suara yang sesuai). Sederhananya saya bisa menuliskan pendapat dan pengalaman saya dalam sebuah jawaban, tetapi itu tidak akan lebih benar atau salah dari jawaban yang lain, yang masalahnya adalah pertanyaan rekomendasi bahasa, dan mengapa saya memilih untuk menutup.
Jimmy Hoffa
7
OMG, @Neil mengetahui apa yang sebenarnya dilakukan komputer dengan pasti akan menjadikan Anda seorang programmer yang lebih baik. Saya belum menulis perakitan selama bertahun-tahun tetapi secara teratur membacanya (melalui banyak platform) dan jika Anda peduli bagaimana program Anda benar-benar bekerja, penting untuk mengetahui setidaknya dasar-dasarnya.
dash-tom-bang
3
@ Neil, dalam hal apa menjadi programmer lebih buruk manfaatnya? Apa yang membuat Anda memunculkan kode spageti? Apa kaitan kode spaghetti dengan perakitan atau menjadi pemrogram yang baik, kecuali di dunia fantasi tidak mengetahui perakitan dan membutuhkan rasionalisasi untuk menghindari mempelajarinya? Jika ada, menjadi juru kode perakitan yang baik membuat orang sangat menyadari praktik pengkodean yang buruk.
dash-tom-bang
12

tl; dr. Mempelajari hal-hal baru hanya dapat membuat Anda menjadi programmer yang lebih baik, tetapi menjadi programmer yang lebih baik bukanlah tentang bahasa tempat Anda menulis kode.

Apa keuntungan menggunakan LISP dan Haskell?

PELAT:

  1. Kode homoikonik. Ini memungkinkan kode modifikasi diri terstruktur.
  2. Makro sintaksis sadar. Mereka memungkinkan penulisan ulang kode boilerplate.
  3. Pragmatisme. CL dirancang untuk menyelesaikan pekerjaan para profesional yang bekerja. Kebanyakan bahasa fungsional tidak, sebagai suatu peraturan.
  4. Fleksibilitas. Ia dapat melakukan banyak hal berbeda, semuanya dengan kecepatan yang wajar.
  5. Ketangkasan. Dunia nyata itu berantakan. Pengkodean pragmatis akhirnya harus menggunakan atau menciptakan konstruksi yang berantakan. Common Lisp memiliki tingkat kelemahan yang cukup untuk menyelesaikan sesuatu.

Arguably satu-satunya alasan nyata untuk memilih terhadap CL adalah bahwa perpustakaan standar diberi tanggal.

Saya akan mengambil risiko dan mengatakan bahwa dalam kasus umum, sintaksis seharusnya tidak menjadi masalah bagi pekerja perangkat lunak profesional.

Dari: Mengapa Lisp bermanfaat?

Haskell:

Haskell adalah bahasa pemrograman komputer. Secara khusus, ini adalah bahasa yang diketik secara statis, malas, fungsional murni, sangat berbeda dari kebanyakan bahasa pemrograman lainnya. Bahasa ini dinamai Haskell Brooks Curry, yang karyanya dalam logika matematika berfungsi sebagai dasar untuk bahasa fungsional. Haskell didasarkan pada kalkulus lambda, karenanya lambda kita gunakan sebagai logo.

Anda dapat membaca di sana deskripsi Fungsional vs imperatif

Dari: http://www.haskell.org/haskellwiki/Introduction

Apakah mereka akan menjadikan saya programmer yang lebih baik?

Ya, tentu saja, mengetahui lebih banyak bahasa dan paradigma hanya dapat membuat Anda menjadi programmer yang lebih baik, tetapi langsung saja:

Tidak ada alat tunggal, buku tunggal, paradigma pemrograman tunggal yang akan membuat Anda seorang programmer yang lebih baik.

Mempelajari bahasa pemrograman yang berbeda dengan paradigma yang berbeda pasti membantu Anda untuk menjadi programmer yang lebih baik, belajar untuk memecahkan masalah dengan pendekatan yang berbeda juga sangat menguntungkan pemikiran logis Anda.

Menjadi seorang programmer yang baik tidak banyak tentang bahasa, tetapi tentang memiliki kemampuan untuk menyelesaikan masalah dalam bahasa apa pun. Dan ketika Anda tidak tahu bahasa, kemampuan untuk mempelajari bahasa itu dengan cepat dan menggunakannya secara efektif.

Saya pikir, semakin global pemikiran Anda, semakin baik pengembang Anda.

Misalnya, Anda dapat menambahkan komentar yang berguna ke kode Anda, peduli tentang keterbacaan kode Anda, rawatan. Perhatikan detail kecil. Pikirkan sebelum mengetik !. Pelajari tentang pola desing. Ikuti praktik yang baik.

Pengungkapan: Ini adalah iklan yang paling memalukan, karena berasal dari blog saya.

jsedano
sumber
4
Sudahkah Anda mempelajari LISP atau Haskell hingga tingkat kompeten?
Jimmy Hoffa
10
Agak tidak jujur ​​untuk mendengar ini dari seseorang yang tidak tahu bahasa apa pun. Anda mengklaim itu bukan alat yang Anda butuhkan saat ini tetapi Anda tidak tahu alat apa yang dibutuhkan, jadi bagaimana Anda bisa tahu ini? Juga bagaimana Anda bisa memberi tahu seseorang tentang apa yang akan atau tidak akan mereka pelajari dari mereka, sejauh yang Anda ketahui LISP adalah turunan SQL yang hanya berguna dalam analisis data relasional dan Haskell mungkin merupakan subset ketat dari Regexp.
Jimmy Hoffa
10
Ini tidak benar-benar menjawab pertanyaan. Anda berhasil pada prestasi mengesankan memberikan jawaban umum samar-samar untuk pertanyaan tentang dua bahasa yang Anda tidak tahu: /
Andres F.
2
-1 karena ini secara samar menari di sekitar apa yang diajarkan Common Lisp dan Haskell kepada Anda. Contoh: Kode sebagai Data data sebagai kode, kemurnian, transparansi referensial, abstraksi monadik, pemrograman fungsional, pemrograman berorientasi bahasa, pemrograman jenis terarah, dll, dll.
jozefg
3
Selain itu tidak tahu bahasa apa pun, saya tidak berpikir Anda bisa menjawab pertanyaan itu: / Maaf
jozefg
9

Ketika Anda mempelajari bahasa yang berada di luar paradigma yang biasanya Anda operasikan, itu akan membuka pikiran Anda untuk solusi alternatif di hari Anda sehari-hari dan bahkan dapat membantu Anda memahami beberapa fitur dalam bahasa pilihan Anda dengan lebih baik. Hanya dengan mengetahui bahasa-bahasa itu tidak akan menjadikan Anda seorang programmer yang lebih baik kecuali Anda dapat mengambil pelajaran yang Anda pelajari dari bahasa-bahasa itu dan menerapkannya pada situasi yang Anda lihat sehari-hari.

Yang sedang berkata, itu tidak terbatas pada bahasa. Saat Anda membaca berbagai struktur data yang belum pernah Anda lihat atau gunakan sebelumnya, ini dapat membantu memperluas cakupan pengetahuan Anda sehingga saat berikutnya Anda menghadapi masalah, Anda memiliki satu lagi solusi yang mungkin.

Jetti
sumber