Sulit untuk mendefinisikan dengan tepat apa itu "bahasa fungsional" - dari bahasa yang Anda cantumkan, hanya Haskell yang murni fungsional (semua yang lain mengadopsi semacam pendekatan hybrid). Ada fitur bahasa tertentu yang sangat membantu untuk pemrograman fungsional, dan Ruby dan Python tidak memiliki cukup dari mereka untuk menjadi lingkungan yang sangat baik untuk FP. Berikut adalah daftar periksa pribadi saya, sesuai urutan kepentingannya:
- Fungsi dan penutupan kelas satu (Ruby, Python, dan semua yang Anda daftarkan memiliki ini).
- Optimalisasi panggilan ekor yang dijamin (Erlang, Haskell, Scala, dan Skema memilikinya, tetapi belum Python, Ruby, atau Clojure (belum)).
- Mendukung kekekalan dalam bahasa dan pustaka standar (ini adalah yang besar yang dimiliki semua "bahasa fungsional" yang Anda daftarkan (kecuali Skema) tetapi Ruby dan Python tidak).
- Dukungan tingkat bahasa untuk fungsi yang transparan (atau murni) secara referensial (sejauh yang saya tahu, hanya Haskell yang memiliki ini saat ini).
Kebutuhan untuk (1) harus jelas - fungsi tingkat tinggi sangat sulit tanpa fungsi kelas satu. Ketika orang berbicara tentang Ruby dan Python sebagai bahasa yang baik untuk FP, mereka biasanya membicarakan hal ini. Namun, fitur khusus ini diperlukan tetapi tidak cukup untuk membuat bahasa yang baik untuk FP.
(2) telah menjadi kebutuhan tradisional untuk KB sejak Skema ditemukan. Tanpa TCO, tidak mungkin untuk memprogram dengan rekursi yang dalam, yang merupakan salah satu pilar FP, karena Anda mendapatkan stack overflow. Satu-satunya bahasa "fungsional" (menurut definisi populer) yang tidak memiliki ini adalah Clojure (karena keterbatasan JVM), tetapi Clojure memiliki beragam peretasan untuk mensimulasikan TCO. (FYI, Ruby TCO adalah implementasi khusus , tetapi Python khusus tidak mendukungnya .) Alasan TCO harus dijamin adalah bahwa jika itu spesifik implementasi, fungsi rekursif yang dalam akan pecah dengan beberapa implementasi, sehingga Anda tidak bisa benar-benar gunakan semuanya.
(3) adalah hal besar lain yang dimiliki bahasa fungsional modern (terutama Haskell, Erlang, Clojure, dan Scala) yang tidak dimiliki oleh Ruby dan Python. Tanpa membahas terlalu banyak detail, immutability yang dijamin menghilangkan seluruh kelas bug, terutama dalam situasi bersamaan, dan memungkinkan hal-hal yang rapi seperti struktur data yang persisten . Sangat sulit untuk mengambil manfaat dari manfaat ini tanpa dukungan tingkat bahasa.
(4) bagi saya adalah hal yang paling menarik tentang bahasa murni fungsional (bukan bahasa hibrida). Pertimbangkan fungsi Ruby yang sangat sederhana berikut:
def add(a, b)
a + b
end
Ini terlihat seperti fungsi murni, tetapi karena operator kelebihan beban, ini dapat mengubah parameter atau menyebabkan efek samping seperti mencetak ke konsol. Tidak mungkin seseorang akan membebani +
operator untuk memiliki efek samping, tetapi bahasa tidak memberikan jaminan. (Hal yang sama berlaku untuk Python, walaupun mungkin tidak dengan contoh khusus ini.)
Di dalam bahasa yang murni fungsional, di sisi lain, ada jaminan tingkat bahasa yang fungsinya transparan secara referensial. Ini memiliki banyak keuntungan: fungsi murni dapat dengan mudah ditulis; mereka dapat dengan mudah diuji tanpa bergantung pada negara global apa pun; dan nilai-nilai dalam fungsi dapat dievaluasi dengan malas atau paralel tanpa khawatir tentang masalah konkurensi. Haskell mengambil keuntungan penuh dari ini, tetapi saya tidak cukup tahu tentang bahasa fungsional lain untuk mengetahui apakah mereka melakukannya.
Semua yang dikatakan, dimungkinkan untuk menggunakan teknik FP di hampir semua bahasa (bahkan Jawa). Misalnya, Google MapReduce terinspirasi oleh ide-ide fungsional, tetapi sejauh yang saya tahu mereka tidak menggunakan bahasa "fungsional" untuk proyek-proyek besar mereka (saya pikir mereka kebanyakan menggunakan C ++, Java, dan Python).