Bagi Anda yang berpengalaman di Haskell dan beberapa rasa Lisp, saya penasaran betapa "menyenangkan" (menggunakan istilah yang mengerikan) untuk menulis kode di Haskell vs. Lisp.
Beberapa latar belakang: Saya belajar Haskell sekarang, setelah sebelumnya bekerja dengan Scheme dan CL (dan sedikit terjun ke Clojure). Secara tradisional, Anda dapat menganggap saya penggemar bahasa dinamis karena kesederhanaan dan kecepatan yang mereka sediakan. Saya segera jatuh cinta dengan makro Lisp, karena itu memberi saya cara lain untuk menghindari verbositas dan boilerplate.
Saya menemukan Haskell sangat menarik, karena memperkenalkan saya pada cara-cara pengkodean yang saya tidak tahu ada. Ini pasti memiliki beberapa aspek yang sepertinya akan membantu dalam mencapai ketangkasan, seperti kemudahan menulis fungsi parsial. Namun, saya agak khawatir tentang kehilangan makro Lisp (saya berasumsi saya kehilangan mereka; sejujurnya saya mungkin belum mempelajarinya?) Dan sistem pengetikan statis.
Adakah orang yang telah melakukan sejumlah pengkodean yang layak di kedua dunia keberatan berkomentar tentang bagaimana pengalaman berbeda, mana yang Anda sukai, dan jika preferensi tersebut bersifat situasional?
sumber
Pertama-tama, jangan khawatir kehilangan fitur tertentu seperti pengetikan dinamis. Karena Anda sudah familiar dengan Common Lisp, bahasa yang dirancang dengan sangat baik, saya berasumsi Anda sadar bahwa bahasa tidak dapat direduksi menjadi kumpulan fiturnya. Ini semua tentang keseluruhan yang koheren, bukan?
Dalam hal ini, Haskell bersinar terang seperti halnya Common Lisp. Fitur-fiturnya digabungkan untuk memberi Anda cara pemrograman yang membuat kode menjadi sangat pendek dan elegan. Kurangnya makro diatasi dengan konsep yang lebih rumit (tetapi, juga, lebih sulit untuk dipahami dan digunakan) seperti monad dan panah. Sistem tipe statis menambah kekuatan Anda daripada menghalangi Anda seperti pada kebanyakan bahasa berorientasi objek.
Di sisi lain, pemrograman di Haskell jauh kurang interaktif daripada Lisp, dan jumlah refleksi yang luar biasa dalam bahasa seperti Lisp tidak sesuai dengan pandangan statis dunia yang diandaikan Haskell. Oleh karena itu, set alat yang tersedia untuk Anda sangat berbeda antara kedua bahasa tersebut, tetapi sulit untuk dibandingkan satu sama lain.
Saya pribadi lebih suka cara pemrograman Lisp secara umum, karena saya merasa itu cocok dengan cara saya bekerja lebih baik. Namun, ini tidak berarti Anda harus melakukannya juga.
sumber
Ada lebih sedikit kebutuhan untuk metaprogramming di Haskell daripada di Common Lisp karena banyak yang dapat disusun di sekitar monad dan sintaks yang ditambahkan membuat DSL yang disematkan terlihat kurang seperti pohon, tetapi selalu ada Template Haskell, seperti yang disebutkan oleh ShreevatsaR , dan bahkan Liskell (semantik Haskell + Lisp sintaks) jika Anda menyukai tanda kurung.
sumber
Mengenai makro, berikut adalah halaman yang membahasnya: Halo Haskell, Selamat tinggal Lisp . Ini menjelaskan sudut pandang di mana makro tidak diperlukan di Haskell. Itu datang dengan contoh singkat untuk perbandingan.
Contoh kasus di mana makro LISP diperlukan untuk menghindari evaluasi kedua argumen:
Contoh kasus di mana Haskell tidak mengevaluasi kedua argumen secara sistematis, tanpa memerlukan definisi makro:
Dan voila
sumber
delay
tidak bisa menjadi fungsi.accept
adalah (E) DSL. Theaccept
Fungsi adalah analog dari makro diuraikan pada halaman sebelumnya, dan definisiv
persis sejajar dengan definisiv
dalam Skema pada slide 40. Haskell dan Skema fungsi menghitung hal yang sama dengan strategi evaluasi yang sama. Makro memungkinkan Anda untuk mengekspos lebih banyak struktur program Anda ke pengoptimal. Anda hampir tidak dapat mengklaim ini sebagai contoh di mana makro meningkatkan kekuatan ekspresif bahasa dengan cara yang tidak direplikasi oleh evaluasi malas.automaton
menjadiletrec
,:
menjadiaccept
,->
menjadi tidak ada dalam versi ini). Masa bodo.Saya seorang programmer Common Lisp.
Setelah mencoba Haskell beberapa waktu lalu, inti pribadi saya adalah tetap menggunakan CL.
Alasan:
Haskell tentu saja memiliki kelebihannya sendiri dan melakukan beberapa hal dengan cara yang berbeda secara fundamental, tetapi bagi saya tidak berhasil dalam jangka panjang.
sumber
dilbert = dogbert.hire(dilbert);
" ?? Saya ragu banyak programmer Haskell bahkan dapat membaca ini tanpa bergerak sedikitpun.Di Haskell Anda bisa mendefinisikan fungsi if, yang tidak mungkin dilakukan di LISP. Hal ini dimungkinkan karena kemalasan, yang memungkinkan adanya lebih banyak modularitas dalam program. Makalah klasik ini: Mengapa FP penting oleh John Hughes, menjelaskan bagaimana kemalasan meningkatkan komposabilitas.
sumber
fold
, misalnya sedangkan fungsi non-ketat lakukan .Ada hal-hal keren yang bisa Anda capai di Lisp dengan makro yang rumit (jika mungkin) di Haskell. Ambil contoh makro `memoize '(lihat Bab 9 dari PAIP Peter Norvig). Dengan itu, Anda dapat mendefinisikan sebuah fungsi, katakanlah foo, dan kemudian cukup evaluasi (memoize 'foo), yang menggantikan definisi global foo dengan versi memo. Bisakah Anda mencapai efek yang sama di Haskell dengan fungsi tingkat tinggi?
sumber
Saat saya melanjutkan perjalanan pembelajaran Haskell, tampaknya satu hal yang membantu "menggantikan" makro adalah kemampuan untuk menentukan operator infix Anda sendiri dan menyesuaikan prioritas dan asosiatifnya. Agak rumit, tapi sistemnya menarik!
sumber