Fonksiyonel programlama: reassignment vs devlet

oy
13

Devletin benim şimdiki cepten kavramı arasındaki farka etrafında başım için yardıma ihtiyacın ve yolu Haskell veya Clojure gibi işlevsel bir dille yapılırdı.

Bir basmakalıp örnek kullanırsak, en biz basitleştirilmiş banka hesap nesneler / yapılar / ne olursa olsun uğraşıyoruz diyelim. bir OOP dili, ben faiz oranı gibi şeyler için örnek değişkenleri olurdu bir BankAccount, bir başvuru tutan bazı sınıf olurdu ve genellikle nesnenin durumunu değiştirme ve setInterestRate gibi yöntemleri () hiçbir şey döndürür. Clojure demek, ben bir banka hesap struct (yüceltilmiş HashMap), ve bir banka hesap parametresi ve diğer bilgileri almak özel fonksiyonlara sahip ve yeni bir yapı dönmek istiyorum. Bunun yerine orijinal nesnenin durumunu değiştirme, şimdi bir yenisi istenen değişikliklerle iade edilen sahiptir.

Yani ... Onunla ne yapacağım? herhangi bir değişkeni eski banka-hesap başvuran edildi üzerine yazılsın mı? Eğer öyleyse, o devlet değişen NYP yaklaşımı üzerinde avantajları var? Sonunda, her iki durumda da bir gerekli değişikliklerle nesneyle ilgili bir değişkeni görünüyor. Ben olduğum gibi zekalı, ben neler olduğunu sadece belirsiz kavram var.

Ben, herhangi bir yardım için teşekkürler mantıklı umut!

Oluştur 09/12/2008 saat 20:24
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
11

Saf bir işlevsel bir tarzda, herhangi değişkenlerin üzerine asla.

Bir benzetme fizikte uzay-olacaktır. Eğer 3d dünyayı düşünün, o zaman nesneleri sabit olmayan pozisyonları - zamanla taşıyın. Fiziksel dünyada ayı için matematik getirmek için, bu nedenle bir zaman boyutu ekler ve belirli zamanlarda çeşitli özelliklerinin değerlerini göz önünde bulundurun. Bunu yaparken, biz sabitleri içine çalışmamızın nesneleri yaptık. Benzer şekilde, programlama, değişmez değerleri ile çalışarak olduğu için kavramsal bir sadelik vardır. gerçek dünyadaki bir kimlikle nesneler oldukça değişir tek bir değer olarak fazla değişmez değerleri (kat artan objenin durumları) 'in bir dizi olarak modellenebilir.

Elbette bir "nesne kimliği" değerler dizisini ilişkilendirmek nasıl ayrıntıları biraz tüylü olabilir. Haskell sahiptir monads size örnek bir devlet olsun. Fonksiyonel Reaktif Programlama ben programlama için çok umut verici yönü olduğunu düşünüyorum, saf fonksiyonel güncellemeler ile dünyanın modelleme nesnelere dair daha edebi bir girişimdir.

Ben Clojure, Haskell aksine saf olmadığını unutmayın ve siz önerildiği gibi değişkenleri güncelleyebilirsiniz. Yalnızca yüksek bir düzeyde birkaç değişken güncelleme yapıyorsanız, yine muhtemelen fonksiyonel programlamanın kavramsal basitlik birçok avantajını elde edersiniz.

Cevap 09/12/2008 saat 21:10
kaynak kullanıcı

oy
8

Tahminen OO dünyada bir döngü var ve isteklerine yanıt olarak tekrar tekrar bu banka hesaplarını değiştiriyorsunuz. Diyelim ki hesaplarının tam bir portföy var ve bu tip Portföyünü olduğunu kabul edelim. Sonra Haskell Saf bir fonksiyonu yazardım

updatePortfolio :: Request -> Portfolio -> Portfolio

Ve ana döngü standart girdiden okuma istekleri ve güncel portföyünüzü tutabilir. (Örnek çok kullanım siz de portföy yazabilir, ama daha basit olmadığı sürece değildir.)

readRequest :: IO Request  -- an action that, when performed, reads a Request with side effects

main :: Portfolio -> IO ()  -- a completely useless program that updates a Portfolio in response to a stream of Requests

main portfolio = do req <- readRequest
                    main (updatePortfolio req)

ve şimdi size değişken durumuna ne olduğunu görmek umut: Tipik bir fonksiyonel programda, değiştirir devlet bir işleve parametre olarak geçirilir. devlet changess, yeni bir işlev çağrısı yaparken. Çağrı (eğer 'doğru kuyruk çağrısı' bakabilirsiniz) kuyruk konumda ve bu nedenle herhangi bir ek kaynak kullanmaz ve aslında zaman derleyici bir döngü oluşturur montaj kodu üreten ve bu işaretçiyi tutacak bir kayıt Portföy sürekli değişen.

Bu çok oyuncak örnektir ama sana bir fonksiyonel dilin lezzet az şey verir umarım.

Cevap 10/12/2008 saat 04:57
kaynak kullanıcı

oy
4

Yani ... Onunla ne yapacağım? herhangi bir değişkeni eski banka-hesap başvuran edildi üzerine yazılsın mı?

Evet

Eğer öyleyse, o devlet değişen NYP yaklaşımı üzerinde avantajları var?

Diyelim ki bu yapı üzerinde ne yaparsak eylem hesaplama uzun bir zaman alır ve bir şey yarıda olur ve geri orijinal yapı dönmeniz gerekir ya hesaplama hata geçirilen diyelim. yorumlanması ile OO bana hediye ettik yeterli bilgi başarısız işlev çağrısından verildi sürece bu veri bozuk --O en bilinmeyen olabilir (bir değişmez OO dili olabilir, çünkü bir başvuru kullanarak) ve başarısız öneride bulunmasına olanak verir kötü. fonksiyonel bir yaklaşımda Eğer başlangıçta bir kopyasını yapılan -Çünkü orijinal veri yapısı doğru olduğundan emin olarak biliyoruz.

çok kanallı uygulamalarda bu senaryoyu uzatın. Biz hepimiz bunun kendi sürümüne sahip beri kimsenin biz veri yapısı kullanılarak sağlayabilirsiniz.

Ayrıca, biz den kopyaladığınız diğer yapıdan verilerini kullanarak yerden tasarruf edebilirsiniz. Listenin kafasına bir öğe eklerken Klasik bir örneğidir. ikinci öğe için bir işaretçi ve ilk sadece boyutuna sahip iki listeyi referans birinci elemanına bir işaretçi (aşağıya bakınız). değişmezlik olmadan biz bu garanti edemeyiz.

        b__
           |  
a -> [6|] -+-> [5|] -> [4|] -> [3|] -> [2|] -> [1|x]
Cevap 09/12/2008 saat 20:58
kaynak kullanıcı

oy
1

Olan Haskell, bak saf işlevsel dil-olursa olsun hiçbir yeniden atama yanı sıra başka yan etkileri vardır: içinde, IO yapmak için IO monad aslında yerini inşa realworld yeni bir örneği ile , konsolunda görüntülenen örneğin yeni metne sahip dünya.

Cevap 09/12/2008 saat 22:29
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more