Fonksiyonel programlamanın faydalarını anlatan birçok makalede, Haskell, ML, Scala veya Clojure gibi C / C ++ / C # / Java gibi zorunlu dillerden farklı olarak "bildirimsel diller" olarak adlandırılan fonksiyonel programlama dilleri gördüm. Benim sorum, fonksiyonel programlama dillerini zorunlu kılanın aksine açıklayıcı kılan şeydir.
Bildirici ve Zorunlu programlama arasındaki farkları açıklayan sık karşılaşılan bir açıklama, Zorunlu programlamada, bildirim dillerinde "Ne yapmalı" yerine bilgisayara "Bir şey nasıl yapılır" demenizdir. Bu açıklamada yaşadığım sorun, her ikisini de tüm programlama dillerinde yapmak. En alt düzey düzene inmiş olsanız bile, bilgisayara hala "Ne yapmalı" demenize rağmen, CPU'ya iki sayı eklemesini söylersiniz, eklemeyi nasıl yapacağınız konusunda talimat vermezsiniz. Spektrumun diğer ucuna gidersek, Haskell gibi üst düzey bir saf fonksiyonel dil, aslında bilgisayara belirli bir görevi nasıl başaracağını, bu, bilgisayarınızın tek başına nasıl başaracağını bilmediği belirli bir görevi başarmak için bir dizi talimattır. Haskell, Clojure gibi dillerin C / C ++ / C # / Java'dan açıkça daha yüksek olduğunu ve tembel değerlendirme, değişmez veri yapıları, anonim işlevler, curry, kalıcı veri yapıları vb. işlevsel programlama mümkün ve verimli, ancak bunları açıklayıcı diller olarak sınıflandırmam.
Benim için saf bir bildirim dilleri, yalnızca tamamen beyanlardan oluşan bir dil olacaktır, bu tür dillerin bir örneği CSS olacaktır (Evet, CSS'nin teknik olarak bir programlama dili olmayacağını biliyorum). CSS, yalnızca sayfanın HTML ve Javascript'i tarafından kullanılan stil bildirimlerini içerir. CSS, bildirim yapmaktan başka bir şey yapamaz, sınıf işlevleri oluşturamaz, yani bazı parametreye dayalı olarak görüntülenecek stili belirleyen işlevler, CSS komut dosyaları yürütemezsiniz, vb. programlama dili).
Güncelleme:
Son zamanlarda Prolog ile oynuyorum ve bana göre, Prolog tamamen bildirimsel bir dile en yakın programlama dilidir (En azından benim görüşüme göre), eğer sadece tamamen bildirici programlama dili değilse. Prolog'da ayrıntılı programlama yapmak, bir olguyu (belirli bir girdi için doğru döndüren bir yüklem işlevi) veya bir kuralı (girdilere dayalı olarak belirli bir koşul / desen için doğru döndüren bir yüklem işlevi) bildiren kurallar kullanılarak yapılır. bir desen eşleştirme tekniği kullanılarak tanımlanır. Prologda herhangi bir şey yapmak için, bir yüklemin bir veya daha fazla girişini bir değişkenle değiştirerek bilgi tabanını sorgularsınız ve prolog yüklemin başarılı olduğu değişken (ler) için değerleri bulmaya çalışır.
Demek istediğim, prologda zorunlu talimatlar yok, temelde bilgisayara bildiklerini anlatıyor (bildiriyor) ve sonra bilgi hakkında soruyor (sorguluyor). İşlevsel programlama dillerinde, bellek konumlarını doğrudan değiştirmiyorsanız veya adım adım hesaplama yazmasanız bile, hala bir değer veriyorsunuz, örneğin X işlevini çağırın ve buna 1 ekleyin, vb. Haskell, ML, Scala veya Clojure'da programlamanın bu anlamda beyan edici olduğunu söyleyemem, ancak yanlış olabilirim. Yukarıda tarif ettiğim anlamda uygun, doğru, saf fonksiyonel programlama beyanı var.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(Umarım bunu anladın, Clojure). Benim asıl sorum, bunu bu int'den farklı kılan şey, x = 1; x += 2; x *= x; return x;
bence çoğunlukla aynı.