İşlevsel diller, tanımı gereği, durum değişkenlerini korumamalıdır. Öyleyse neden Haskell, Clojure ve diğerleri yazılım işlemsel bellek (STM) uygulamaları sağlıyor? İki yaklaşım arasında bir çatışma var mı?
İşlevsel diller, tanımı gereği, durum değişkenlerini korumamalıdır. Öyleyse neden Haskell, Clojure ve diğerleri yazılım işlemsel bellek (STM) uygulamaları sağlıyor? İki yaklaşım arasında bir çatışma var mı?
Yanıtlar:
Değişken durumu koruyan işlevsel bir dilde yanlış bir şey yoktur. Haskell gibi "saf" işlevsel dillerin bile, gerçek dünyayla etkileşime girebilmek için durumunu sürdürmesi gerekir. Clojure gibi "Impure" işlevsel diller, mutasyon durumu içerebilen yan etkilere izin verir.
Asıl nokta, işlevsel dillerin gerçekten ihtiyacınız olmadıkça değişebilir durumu engellemektir . Genel stil, saf fonksiyonlar ve değişmez veriler kullanarak programlamak ve kodunuzun onu gerektiren belirli bölümlerinde yalnızca "saf" değişken durumla etkileşime girmektir. Bu şekilde, kod tabanınızın geri kalanını "saf" tutabilirsiniz.
STM'nin işlevsel dillerde daha yaygın olmasının birkaç nedeni olduğunu düşünüyorum:
Şahsen Clojure'in değişkenliğe izin verme yaklaşımını beğeniyorum, ancak yalnızca STM işlemlerine katılabilecek katı biçimde denetlenmiş "yönetilen referanslar" bağlamında. Dilde her şey "tamamen işlevsel" dir.
;; define two accounts as managed references
(def account-a (ref 100))
(def account-b (ref 100))
;; define a transactional "transfer" function
(defn transfer [ref-1 ref-2 amount]
(dosync
(if (>= @ref-1 amount)
(do
(alter ref-1 - amount)
(alter ref-2 + amount))
(throw (Error. "Insufficient balance!")))))
;; make a stranfer
(transfer account-a account-b 75)
;; inspect the accounts
@account-a
=> 25
@account-b
=> 175
Yukarıdaki kodun tamamen işlemsel ve atomik olduğuna dikkat edin - başka bir işlemdeki iki dengeyi okuyan harici bir gözlemci her zaman tutarlı bir atom durumu görecektir, yani iki bakiye her zaman 200'e kadar toplanacaktır. Kilit tabanlı eşzamanlılık ile bu şaşırtıcı bir şekilde zor bir sorundur Çok sayıda işlem varlığına sahip büyük bir karmaşık sistemde çözmek için.
Bazı ekstra aydınlanma için, Rich Hickey, bu videoda Clojure'un STM'sini açıklamak için mükemmel bir iş çıkardı.
İşlevsel diller, tanımı gereği, durum değişkenlerini korumamalıdır
Tanımın yanlış. Devleti koruyamayan dil kullanılamaz.
İşlevsel ve zorunlu diller arasındaki fark, birinin diğeri olması diğeri değildir. Devleti korudukları bir şekilde.
Zorunlu diller programın her yerine yayılmış durumda.
İşlevsel diller, durumu tür imzalarıyla izole eder ve sürdürür. Ve bu, STM gibi gelişmiş devlet yönetimi mekanizmaları sağlamalarının nedenidir.
Bazen bir program değişken durum gerektirir (örneğin, bir web uygulaması için veritabanı içeriği) ve işlevsel programlamanın avantajlarını kaybetmeden kullanabilmek harika olurdu . İşlevsel olmayan dillerde, değişken durum her şeye nüfuz eder. Bir çeşit özel API ile açık hale getirirseniz , o zaman her şey tamamen işlevsel kalırken onu tanımlanabilir küçük bir bölgeyle sınırlayabilirsiniz. FP'nin faydaları arasında kolay hata ayıklama, tekrarlanabilir birim testi, ağrısız eşzamanlılık ve çok çekirdekli / GPU dostu olması sayılabilir.