Mengapa sintaksis bahasa fungsional tidak lebih dekat dengan bahasa manusia?

14

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.

JohnDoDo
sumber
4
@ scratchet freak: :) jadi adakah yang dirancang oleh seorang pria yang membenci notasi Polandia?
JohnDoDo
10
@ scratchetfreak Dalam hal apa sintaksis Haskell menyerupai notasi polesan? Operator Haskell adalah infix, sama seperti kebanyakan operator bahasa lain (dan panggilan fungsi awalan - juga seperti kebanyakan panggilan fungsi bahasa lain).
sepp2k
9
Itu asumsi / lompatan yang cukup besar yang Anda buat, bahwa "lebih dekat ke bahasa manusia" sama dengan "lebih ekspresif."
Matt Ball
7
Pernah mendengar tentang Cobol dan Fortran?
ott--
7
Untuk alasan yang persis sama bahwa matematikawan mengganti frase latin panjang dengan ekspresi aljabar. Dengan sedikit latihan, notasi yang lebih ringkas jauh lebih produktif.
kevin cline

Jawaban:

14

Bahasa fungsional seperti Haskell dan pendahulunya Miranda tumbuh dari konsep matematika kalkulus lambda . Dari halaman Wikipedia:

Kalkulus Lambda (juga ditulis sebagai λ-kalkulus atau disebut "kalkulus lambda") adalah sistem formal dalam logika matematika untuk mengekspresikan komputasi dengan cara pengikatan dan substitusi variabel.

...

Kalkulus Lambda telah memainkan peran penting dalam pengembangan teori bahasa pemrograman. Rekan yang paling menonjol untuk kalkulus lambda dalam ilmu komputer adalah bahasa pemrograman fungsional, yang pada dasarnya mengimplementasikan kalkulus (ditambah dengan beberapa konstanta dan tipe data). Selain bahasa pemrograman, kalkulus lambda juga memiliki banyak aplikasi dalam teori bukti. Contoh utama dari hal ini adalah korespondensi Curry-Howard, yang memberikan korespondensi antara berbagai sistem kalkulus lambda yang diketik dan sistem logika formal.

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.

Mark Booth
sumber
29

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:

x = x + 1

dan dia akan benar-benar bingung, mengatakan: "Ini tidak masuk akal, tidak ada xyang xsetara dengan xplus 1."

Apakah beberapa notasi tertentu "samar" atau tidak, adalah masalah pendapat dan keakraban.

Jörg W Mittag
sumber
8
Hanya ada satu masalah dengan jawaban ini: Saya bukan ahli matematika.
JohnDoDo
6
@ sepp2k: Saya tidak setuju. Bagi kebanyakan orang tanpa paparan sebelumnya ke bahasa pemrograman dan beberapa latar belakang matematika dasar sintaks Haskell akan jauh lebih mudah untuk dipahami daripada kode prosedural khas dengan semua efek sampingnya dan pernyataan lingkungan yang rumit dieksekusi. Sintaksis seperti wherememungkinkan untuk menyingkat intisari dari sebuah fungsi dalam satu baris.
Benjamin Bannier
17
-1: jawaban ini tampaknya sangat bagus. Saya cukup yakin OP berarti bahasa yang diucapkan.
Steven Evers
6
Sebenarnya, saya cukup yakin itu x = infinitymemang menyelesaikan persamaan.
DeadMG
6
Nah, bahasa pemrograman juga dirancang oleh manusia .... Jadi dengan definisi Anda, mereka adalah bahasa manusia.
marco-fiset
13

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:

for each (Person person in people)
    print(person.name)

yang benar-benar terbaca sebagai bahasa Inggris.

Versi Haskell mungkin (dan ini bukan Haskell yang valid, tetapi hanya untuk perbandingan sintaksis):

map (print . name) people

yang membutuhkan lebih sedikit kode dan lebih sedikit pertengkaran detail - Saya tidak perlu memecah hal-hal menjadi satu lingkaran dan variabel (s) ( for each (...)), mapfungsi 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.

paul
sumber
8

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.

Richard Close
sumber
3
Saya juga akan menambahkan bahwa bahasa fungsional sering dapat mengekspresikan konsep tingkat tinggi, ini lebih abstrak, lebih sulit untuk bermakna
jk.
1
@ jk, ya, setuju! Pada saat yang sama, itu sebabnya mereka memiliki kurva belajar yang curam untuk programmer dengan latar belakang imperatif dan sedikit matematika (seperti saya), dan mengapa mereka berharga.
Richard Tutup
3

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 fromdan todalam 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 dari in), 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 + 4itu lebih mudah dibaca daripada add (mult 2 3) 4atau add(mult(2, 3), 4).

sepp2k
sumber
@ PeterTaylor Tidak, hanya aku yang bodoh ;-) Tetap sekarang.
sepp2k
3

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:

  • kesamaan dengan bahasa alami tampaknya tidak menghasilkan peningkatan langsung dalam kegunaan
  • meniru bahasa alami secara langsung dapat menghasilkan bahasa komputer yang verbose dan tidak jelas

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.

datang badai
sumber
3

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 whereklausa 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:

qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
               where lesser = [x | x <- xs, x <= p] 
                     greater = [x | x <- xs, x > p]

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.

Andrea
sumber
3
Saya hampir tidak bisa menyebut itu bisa dibaca manusia. Saya tahu quicksort. Saya terbiasa dengan cara mengaturnya dalam berbagai bahasa yang berbeda, saya tahu apa yang harus dilakukan, dan saya masih tidak dapat membuat kepala atau ekor keluar dari bagian bawah potongan kode itu.
Mason Wheeler
Saya kira itu sangat tergantung pada latar belakang Anda. Ini sejelas bagi saya ...
Andrea
2
Bagaimanapun, itu seharusnya menyerupai notasi ini: purplemath.com/modules/setnotn.htm
Andrea
4
Apakah Anda yakin tidak seharusnya demikian ++ [p] ++?
Peter Taylor
1
@Mason: Tampaknya cukup jelas bagi saya, dan saya belum pernah menulis baris Haskell
kevin cline
2

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.

GlenPeterson
sumber
Saya pikir ini adalah jawaban terbaik - satu-satunya yang membuat perbedaan jelas antara proses dan pernyataan.
Milind R