Pertanyaan ini muncul dari pertanyaan /software/25569/is-haskell-worth-learning
Secara umum beberapa pernyataan yang sering diulang dibuat, tentang bagaimana Haskell meningkatkan keterampilan pengkodean Anda dalam bahasa lain, dan lebih jauh lagi, ini karena Haskell tidak memiliki kewarganegaraan, dan itu adalah hal yang baik.
Mengapa?
Saya pernah melihat seseorang membandingkan ini dengan hanya mengetik dengan tangan kiri, atau mungkin menutup mata Anda selama sehari dan hanya mengandalkan sentuhan. Tentunya ada lebih dari itu?
Apakah itu terkait dengan akses memori perangkat keras, atau sesuatu yang merupakan perolehan kinerja besar?
Jawaban:
setidaknya ada tiga keuntungan besar di atas kepala saya:
itu membuat program lebih dekat dengan ekspresi matematika. Dalam matematika,
x
tidak berubah, Anda tidak tahu apa itu sampai Anda menyelesaikan persamaannya.Pada akhirnya, ada adalah perubahan negara (setelah semua, itu bagaimana komputer bekerja pada tingkat rendah); tetapi dibatasi oleh bahasa di tempat-tempat tertentu. yang memungkinkan kompiler peluang besar untuk memindahkan kode untuk mengoptimalkannya, karena ia tahu bahwa ia tidak mengubah apa pun yang bergantung pada kode lain.
Kode konkuren tidak perlu disinkronkan untuk mengakses data yang tidak berubah, sehingga konkurensi ditingkatkan, baik dalam sistem memori bersama SMP (semua sistem multicore saat ini), dan pada kluster yang terikat secara longgar.
sumber
Inilah keuntungan lain: kopling yang dikurangi. Jika Anda memiliki kode seperti:
dan di tempat lain Anda memiliki:
maka kedua fungsi tersebut tergantung secara implisit . Tidak ada cara mudah untuk mengatakan bahwa panggilan
doStuff
dipengaruhi oleh panggilandoOtherStuff
. Tanpa status bisa berubah, Anda harus membuat koneksi eksplisit.Tentu saja, ini bukan masalah dengan semua status yang bisa berubah - masalah ini adalah status yang bisa berubah. Solusi sebenarnya adalah memiliki kekekalan secara default dan beberapa cara "menandai" dan membatasi keadaan yang bisa berubah ke tempat yang Anda butuhkan.
sumber
Jawaban yang disederhanakan adalah: ketika Anda melihat nama dalam bahasa yang murni fungsional, Anda tahu apa nilai yang terkait dengan pencarian sederhana dari definisinya. Jika Anda memiliki variabel yang dapat berubah, Anda hanya dapat mengetahui dari beberapa penugasan mana yang dieksekusi terakhir, jadi Anda juga harus menganalisis aliran kontrol, yang pada gilirannya mungkin bersyarat, membuat Anda memiliki banyak kemungkinan. Untuk mendapatkan ledakan eksponensial, Anda hanya perlu mempertimbangkan bahwa RHS dari tugas itu sendiri tergantung pada variabel, jadi Anda harus menganalisisnya secara rekursif juga.
Intinya dalam analisis di atas adalah bahwa hal itu tidak dapat dipertahankan tanpa komentar yang menjelaskan maksud, invarian, dan semantik: ini mungkin sulit untuk diartikan, dan mungkin sulit untuk memverifikasi semantik dipatuhi dalam kode aktual.
Jawaban ini pada dasarnya adalah perluasan dari poin 1 Javier.
Saya pikir ini juga merupakan penjelasan dari popularitas rezim OO yang curang: dengan OO keadaan yang bisa dirubah diringkas yang membuat analisis jauh lebih mudah dengan menempatkan mutasi pada tingkat tertentu, dan memungkinkan ekspresi dan verifikasi semantik yang jauh lebih kuat.
Setelah mencatat bahwa, pemrograman fungsional bukanlah jawabannya. Jawaban yang tepat adalah sistem yang mendukung pemrograman induktif (fungsional) dan koinduktif (prosedural), sehingga alat yang tepat dapat menangani pemrograman stateless dan stateful. Hanya saja teori konstruktif (fungsional) sudah mapan sedangkan teori manajemen negara masih dalam masa pertumbuhan.
sumber
Sebagai penulis Siege , seorang DBMS yang ditulis dalam Haskell, beberapa orang mungkin menganggap pandangan saya tentang keadaan yang bisa berubah bertentangan. Saya berharap untuk menunjukkan sebaliknya.
Tujuan dari keadaan yang bisa berubah adalah untuk menggambarkan keadaan saat ini di mana suatu sistem berada. Katakanlah Anda memiliki blog dan didukung oleh database, database tersebut menjelaskan posting yang Anda miliki di blog Anda pada titik waktu di mana Anda bertanya Itu. Berapa banyak posting yang ada saat ini?
Bandingkan hal ini dengan keadaan abadi yang digunakan untuk menyampaikan fakta. Berapa banyak posting di sana pada 12 Agustus?
Fakta mudah dipikirkan, keadaan tidak bisa berubah tidak bisa. Namun, keadaan yang bisa berubah bukanlah efek jahat yang tidak murni yang harus dibuang dari jangkauan pikiran kita; kita sering membutuhkannya untuk hidup berdampingan dalam dunia yang bisa berubah yang kita tinggali, kita hanya perlu menggunakannya lebih hemat.
sumber