Saya tertarik pada pemrograman fungsional dan memutuskan untuk head to head dengan Haskell. Kepalaku sakit ... tapi akhirnya aku akan mendapatkannya ... Aku punya satu rasa ingin tahu, mengapa sintaksisnya begitu samar (karena tidak ada kata lain)?
Apakah ada alasan mengapa itu tidak lebih ekspresif , lebih dekat dengan bahasa manusia?
Saya mengerti bahwa FP bagus dalam memodelkan konsep-konsep matematika dan meminjam beberapa alat ekspresi singkat, tapi tetap saja bukan matematika ... itu bahasa.
Jawaban:
Bahasa fungsional seperti Haskell dan pendahulunya Miranda tumbuh dari konsep matematika kalkulus lambda . Dari halaman Wikipedia:
Karena sejarah ini, sintaksis bahasa-bahasa fungsional ini (dan elemen-elemen fungsional dari bahasa-bahasa yang lebih penting) sangat dipengaruhi oleh notasi matematika yang digunakan oleh kalkulus lambda.
Ketelitian yang mana baik notasi matematika dan bahasa komputer dapat menggambarkan persyaratan dan ketepatan dengan mana komputer membutuhkan instruksi mereka untuk ditulis berkorelasi baik satu sama lain. Namun ketidaktepatan bahasa alami menciptakan hambatan besar untuk itu digunakan untuk pemrograman komputer. Bahkan lingkungan pemrograman bahasa Natural yang paling berhasil ( seperti Wolfram Alpha) memerlukan pengalaman domain yang signifikan agar dapat digunakan secara efektif.
sumber
Sintaks Haskell adalah dekat dengan bahasa manusia. Ini secara khusus dirancang untuk menyerupai notasi matematika, yang merupakan bahasa yang dirancang oleh manusia (dengan demikian bahasa manusia ) untuk mengekspresikan secara tepat konsep-konsep yang dibangun Haskell.
Anda dapat menunjukkan sepotong kode Haskell kepada ahli matematika atau ahli logika apa pun, dan dia akan dapat memahaminya, bahkan jika dia belum pernah mendengar tentang Haskell dan sama sekali tidak tahu apa-apa tentang pemrograman, ilmu komputer atau bahkan komputer.
Di sisi lain, Anda dapat menunjukkan kepada ahli matematika atau ahli logika kode seperti ini:
dan dia akan benar-benar bingung, mengatakan: "Ini tidak masuk akal, tidak ada
x
yangx
setara denganx
plus1
."Apakah beberapa notasi tertentu "samar" atau tidak, adalah masalah pendapat dan keakraban.
sumber
where
memungkinkan untuk menyingkat intisari dari sebuah fungsi dalam satu baris.x = infinity
memang menyelesaikan persamaan.Saya pikir satu hal yang mungkin Anda temui adalah sesuatu yang saya temui juga ketika mempelajari pemrograman fungsional, yaitu dengan pemrograman fungsional Anda dapat (dan hampir harus) berpikir / bekerja pada tingkat yang lebih tinggi daripada yang Anda lakukan dengan pemrograman imperatif.
Apa yang Anda temukan sebagai kurang ekspresif, saya pikir sebenarnya lebih ekspresif: Anda tidak perlu menguraikan setiap detail kecil dan dapat melakukan lebih banyak dengan lebih sedikit kode dalam pemrograman fungsional - ada lebih banyak kekuatan untuk apa yang Anda tulis.
Sebagai contoh, saya dapat menulis secara imperatif:
yang benar-benar terbaca sebagai bahasa Inggris.
Versi Haskell mungkin (dan ini bukan Haskell yang valid, tetapi hanya untuk perbandingan sintaksis):
yang membutuhkan lebih sedikit kode dan lebih sedikit pertengkaran detail - Saya tidak perlu memecah hal-hal menjadi satu lingkaran dan variabel (s) (
for each (...)
),map
fungsi mengurus itu untuk saya.Bekerja pada level itu bisa memerlukan waktu untuk membiasakan diri. Jika ada yang membantu, Haskell mungkin adalah waktu terberat saya belajar bahasa baru sejak saya mulai pemrograman, dan saya tahu> 10 bahasa (termasuk Lisp). Itu benar-benar layak dipelajari.
sumber
Saat ini saya mulai terbiasa dengan Scala, jadi saya bisa bersimpati. Setidaknya dengan Scala saya bisa kembali ke gaya imperatif ketika keadaan menjadi terlalu sulit.
Saya pikir ada beberapa kekuatan yang berperan di sini:
Desainer bahasa fungsional tentu memiliki latar belakang matematika yang kuat, sehingga mereka meminjam notasi matematika yang alami bagi mereka.
Ekspresi yang lebih besar (yaitu kekuatan pernyataan, daripada kedekatan dengan bahasa Inggris) dari bahasa apa pun memiliki (IMO) harga yang sesuai dalam kecuraman kurva belajar. Terseness adalah kualitas yang sangat dihargai di Scala, dengan banyak hal bersifat opsional.
Bahasa fungsional hanya melakukan hal-hal yang sangat berbeda, sehingga operasi dasar tidak memetakan ke konstruksi imperatif.
sumber
Jika saya memahami komentar terakhir Anda dengan benar, pertanyaan Anda adalah mengapa Haskell sering menggunakan operator simbolis di tempat-tempat di mana ia juga dapat menggunakan kata kunci alfanumerik (atau nama fungsi)?
Mengenai kata kunci satu jawaban adalah bahwa kata kunci mencegah Anda menggunakan kata-kata tertentu sebagai nama variabel. Misalnya saya selalu kesal ketika saya ingin memanggil variabel saya
from
danto
dalam bahasa di mana salah satunya adalah kata kunci - seperti di Python.Alasan lain untuk operator simbolis secara umum adalah keringkasan. Itu tidak benar-benar berlaku dalam contoh spesifik Anda dari daftar pemahaman (
<-
tidak lebih pendek dariin
), tetapi dalam banyak kasus itu berlaku.Namun alasan lain adalah keterbacaan. Itu mungkin tampak kontra-intuitif karena operator simbolis seringkali lebih sulit untuk dipelajari karena "nama" mereka tidak benar-benar memberi tahu Anda apa pun tentang apa yang mereka lakukan (sementara nama fungsi biasanya akan), tetapi begitu Anda tahu apa yang dilakukan oleh operator tertentu, ekspresi dengan operator simbol infiks seringkali lebih mudah diurai untuk manusia daripada yang memiliki banyak panggilan fungsi awalan alfa-numerik karena operator lebih mudah dibedakan secara visual dari operan dengan cara itu. Sebagai contoh, kebanyakan orang akan setuju bahwa
2 * 3 + 4
itu lebih mudah dibaca daripadaadd (mult 2 3) 4
atauadd(mult(2, 3), 4)
.sumber
Bahasa komputer yang imperatif kebanyakan tidak lebih dekat dengan bahasa alami daripada, katakanlah, Haskell.
Namun, beberapa dirancang untuk lebih menyerupai bahasa Inggris: Cobol dan Hypercard, misalnya. Pelajaran yang akan saya ambil dari contoh-contoh ini adalah:
Bahasa komputer Perl dilaporkan dirancang dengan beberapa aspek yang lebih halus dari bahasa alami dalam pikiran . Saya akan menilai bahwa Perl lebih baik daripada Cobol atau Hypercard pada kegunaan umum, tetapi orang memiliki pendapat yang berbeda tentang Perl.
sumber
Saya pikir Haskell mendapatkan kemiripan dengan bahasa manusia seperti yang bisa didapat tanpa memperkenalkan sintaks yang gila. Ini benar-benar berusaha keras untuk ini, misalnya dengan
where
klausa untuk menunda definisi dan dengan sintaksis pemahaman daftar yang persis apa yang akan saya tulis di papan tulis. Ini juga menghindari karakter asing seperti kawat gigi dan penggunaan indentasi yang bebas. Contoh khasnya adalah quicksort:Diakui, ini adalah contoh sederhana, tapi saya tidak tahu bahasa lain yang membuatnya dapat dibaca seperti ini.
Melakukan hal-hal yang lebih rumit bisa menjadi sulit dibaca di Haskell, tetapi itu ada hubungannya dengan sistem tipe, IO yang dibatasi dan tidak dengan sintaks sama sekali.
Jika ada, saya akan mengatakan bahwa Haskell telah mengorbankan kesederhanaan sintaksis untuk mengakomodasi sintaksis yang lebih mirip dengan bahasa manusia. Skema seperti bahasa memiliki sintaks yang sangat jauh dari apa yang akan ditulis manusia, tetapi sangat sederhana untuk menjelaskan aturannya.
sumber
++ [p] ++
?Saya pikir perbedaannya berkaitan dengan cara pemrograman fungsional / deklaratif membuat pernyataan tentang masalah seolah-olah itu masalah matematika, di mana pemrograman imperatif menggambarkan suatu proses . Dalam dunia bisnis, program komputer membungkus atau mengganti proses fisik, sehingga Anda dapat menemukan bahasa yang mencerminkan ini lebih intuitif.
Ternyata gaya fungsional memungkinkan dirinya untuk menggunakan beberapa prosesor secara aman (karena meminimalkan mutabilitas dan efek samping) - sesuatu yang akan kita lihat lebih banyak di masa depan. Juga, sebagian besar bahasa fungsional modern memiliki koleksi dengan iterator yang dapat Anda gunakan fungsinya. Metode ini dapat membagi beban kerja mereka ke beberapa prosesor dengan sangat efisien tanpa Anda menyadarinya.
sumber