"İşlevsel bir dilin" tam olarak ne olduğunu tanımlamak zor - listelediğiniz dillerin dışında, sadece Haskell tamamen işlevseldir (diğerleri bir tür hibrit yaklaşımı benimser). İşlevsel programlama için çok faydalı olan bazı dil özellikleri vardır, ancak Ruby ve Python'da FP için çok iyi ortamlar olması için yeterli ortamı yoktur. Önem sırasına göre kişisel kontrol listem:
- Birinci sınıf işlevler ve kapanışlar (Ruby, Python ve listelediğiniz diğerlerinin tümü buna sahiptir).
- Garantili kuyruk çağrısı optimizasyonu (Erlang, Haskell, Scala ve Scheme'de buna sahiptir, ancak Python, Ruby veya Clojure (henüz) yoktur).
- Dilde ve standart kütüphanelerde değişmezlik desteği (bu, listelediğiniz tüm "fonksiyonel dillerin" sahip olduğu büyük bir dildir (Scheme hariç) ancak Ruby ve Python yoktur).
- Referans düzeyinde saydam (veya saf) işlevler için dil düzeyinde destek (bildiğim kadarıyla şu anda yalnızca Haskell var).
(1) ihtiyacı açık olmalıdır - birinci sınıf fonksiyonlar olmadan yüksek dereceli fonksiyonlar son derece zordur. İnsanlar Ruby ve Python hakkında FP için iyi diller hakkında konuştukları zaman, genellikle bundan söz ederler. Bununla birlikte, bu özel özellik, bir dili FP için iyi yapmak için yeterlidir.
(2) Şema icat edildiğinden beri FP için geleneksel bir gereklilik olmuştur. TCO olmadan, FP'nin temel taşlarından biri olan derin özyinelemeyle programlamak mümkün değildir, çünkü yığın taşması elde edersiniz. Buna sahip olmayan tek "işlevsel" (popüler tanım) dil, Clojure'dir (JVM'nin kısıtlamaları nedeniyle), ancak Clojure, TCO'yu simüle etmek için çeşitli kesimlere sahiptir. (FYI, Ruby TCO uygulamaya özeldir , ancak Python özel olarak desteklememektedir .) TCO'nun garanti edilmesi gerekliliği, uygulamaya özel ise derin özyinelemeli işlevlerin bazı uygulamalarla kırılması, bu nedenle gerçekten hepsini kullan.
(3) modern fonksiyonel dillerin (özellikle Haskell, Erlang, Clojure ve Scala) Ruby ve Python'un sahip olmadığı bir başka büyük şey. Çok fazla ayrıntıya girmeden, garantili değişmezlik, özellikle eşzamanlı durumlarda tüm böcek sınıflarını ortadan kaldırır ve kalıcı veri yapıları gibi düzenli şeylere izin verir . Dil düzeyinde destek olmadan bu avantajlardan yararlanmak çok zor.
(4) benim için tamamen işlevsel diller (melez dillerin aksine) hakkındaki en ilginç şey. Aşağıdaki son derece basit Ruby işlevini göz önünde bulundurun:
def add(a, b)
a + b
end
Bu, saf bir işleve benziyor, ancak operatörün aşırı yüklenmesi nedeniyle, parametreyi değiştirebilir veya konsola yazdırma gibi yan etkilere neden olabilir. Birisinin +
operatörü yan etkisi olması için aşırı yüklemesi muhtemel değildir , ancak dil hiçbir garanti vermez. (Aynısı Python için de geçerlidir, ancak bu özel örnekte olmasa da)
Öte yandan, tamamen işlevsel bir dilde, işlevlerin referans olarak şeffaf olduğu dil düzeyinde garantiler vardır. Bunun sayısız avantajı vardır: saf fonksiyonlar kolayca not edilebilir; herhangi bir küresel devlete güvenmeden kolayca test edilebilirler; ve işlev içindeki değerler eşzamanlılık sorunları hakkında endişe duymadan tembel ya da paralel olarak değerlendirilebilir. Haskell bundan tam anlamıyla yararlanıyor, ancak yapıp yapmadıklarını bilmek için diğer fonksiyonel diller hakkında yeterince bilgim yok.
Tüm söylenenler, FP tekniklerini neredeyse her dilde (hatta Java) kullanmak mümkün. Örneğin, Google’ın MapReduce’u işlevsel fikirlerden ilham alıyor, ancak bildiğim kadarıyla büyük projeleri için herhangi bir “işlevsel” dil kullanmıyorlar (sanırım çoğunlukla C ++, Java ve Python kullanıyorlar).