* Herhangi bir * program görevi durum olmadan ifade edilebilir mi?


13

Bu teorik bir sorudur, ancak şimdi fark ettiğim şeylerin yıllarca programlanmasından sonra "normal" zorunluluk tekniğidir, esas olarak C ++ kullanarak, rasgele JavaScript öğrenirken yanlışlıkla rastladığım bu işlevsel programlama dünyasını keşfettim.

Bu, teknik olarak herhangi bir devlet odaklı programı tamamen işlevsel ve devletsiz farklı bir uygulama ile değiştirip değiştiremeyeceğinizi merak etmemi sağladı?

Bu ilginç bir fikir ve itiraf etmeliyim ki fonksiyonel programlamada gerçekten aklımı başa çıkaran bir netlik ve zarafet var.


1
Alakalı bir StackOverflow cevabı: stackoverflow.com/questions/3722084/…
jfriend00

Bir noktadan diğerine devam eden bir durum olup olmadığı, hangi programlama paradigmasını kullandığınıza değil, hangi problemi veya görevi kodladığınıza bağlıdır. Bir düğmenin kaç kez tıklandığını sayarsanız, o sayacı kaydetmek için açıkça bir durum vardır ve hangi kodlama tekniğini kullandığınız önemli değildir, işlem sırasında sayıyı takip etmek için durum olması gerekir. Bu nedenle, söz konusu görev, nasıl kodladığınıza bakılmaksızın, yol boyunca durum olmadan tamamlanamaz.
jfriend00

6
Devleti tartışmak isterseniz; sadece programın kendisi için açıkça devlet gereklidir. Değişken ve değişmez durumu düşünüyormuşsunuz gibi geliyor - soruda kastettiğinizi belirtmek isteyebilirsiniz.
Billy ONeal

1
Bu, tüm programların gerçek Turing makinelerine dönüştürülüp dönüştürülemeyeceğini sormak gibidir. Teknik olarak evet, bir veritabanından kaydedip yükleyen programlar bile bir Turing makinesinde bu davranışı simüle etmek zorlaşır. Benzer şekilde, MVC mimarisinde kontrolör tarafı kaldırılan bir programınız olabilir ve tüm çağrıyı yaparsınız, yine de, başa çıkmak daha zorlaşır (programı vatansız hale getirmek için esasen kontrolör olursunuz).
Neil

Yanıtlar:


17

Kısa cevap: evet. Vikipedi'ye göre, evrensel bir hesaplama modeli olarak lambda hesabının Turing makinelerine denkliği Alan Turing tarafından 1937'de gösterildi. Bir Turing makinesinin hesaplama modeli, zorunluluk veya durum bilgisi olan programlama hakkında konuşurken aklında olan şeydir ve lambda hesabı "saf fonksiyonel programlamanın" matematiksel olarak resmileştirilmesidir.

Her etkili hesaplama modelinin bir Turing makinesi ile aynı hesaplamaları yapabileceği ve tam tersi olduğu düşünülmektedir. Buna Church-Turing tezi denir . Bununla birlikte, bu varsayım, az ya da çok sezgisel “etkili hesaplama modeli” terimi nedeniyle kanıtlanamaz (belki birileri gelecekte yeni bir model icat eder?)


2
Aynı argümanınız, tur makinelerine eşdeğer lamba hesabı olarak, her hesaplamanın (az ya da çok gizli) bir duruma sahip olması gerektiğini söyleyerek geri döndürülebilir. Kodun harici olarak (değişkenler aracılığıyla) veya akışın içine (yığın tabanlı işlev çağrısı aracılığıyla) her zaman "durum" olarak temsil edilip edilmediği.
Emilio Garavaglia

3
Lambda hesabı devlete sahiptir; onun kısıtlaması, devletin değişmez olmasıdır. Değişmez devlet hala devlettir. Lambdalar da dahil olmak üzere işlev parametreleri hala durumdur; muhtemelen bir fonksiyonun farklı parametreler verildiğinde farklı davranışlara sahip olmasını istersiniz.
Billy ONeal

@emilio Bir soruna (açıkladığınız gibi) eşdeğer bir duruma dayalı çözüm olduğunu belirtmek, bu çözümün durumsuz hiçbir sürümünün olmadığının kanıtı değildir.
Billy ONeal

2
@EmilioGaravaglia daha sonra bir lambda-calculus yorumlayıcısının durumuna atıfta bulunuyorsunuz. Lambda hesabında muhakeme yaparken, devlet hakkında akıl yürütmeye gerek yoktur. Ayrıca "Değişebilirlik" yönü farklıdır.
wirrbel

1
@EmilioGaravglia: Zorunlu programlamadaki durum bir seferde bellek yapılandırmasıdır, burada parametre alanı tüm olası bellek değerleri tarafından verilir ve durum her seferinde bir yapılandırmadır (turing makinesinin bandı). Lambda hesabına bir program yazarken, bellek alanı gibi doğrudan bir varlık yoktur. Program yürütme lambda dönüşümlerinin uygulanmasıdır. Ara adımlar "duruma" benzeyebilir, ancak bunlar aynı değerin eşdeğer ifadeleridir. Değerlendirme sırasında hiçbir şey değişmez, ifadeler yeniden yazılır ve "daha basit" bir formda işlenir.
wirrbel

14

Hangi dinamik sistemde olursa olsun, “durum”, şimdiki zamanınızı geçmişinizden veya geleceğinizden etkilenmeye iten şeydir (zaman oku matematiksel bir sorun değil, sadece fiziksel bir kısıtlamadır).

"Hatırlayacak" bir şeyiniz olsun ya da ne yaptığınıza bağlıdır, bir durumunuz vardır.

Durumu olmayan bir sistem "dinamik" değildir: sadece kombinatoryal bir fonksiyondur. Bunun bir durumu olmayabilir, ancak - farklı sonuçlar elde etmek için - bir şekilde sağlanacak bir duruma ihtiyaç duyar.

Şimdi, başvurduğunuz hesaplama modeline bağlı olarak, bir durum açıkça (değişken biçiminde) veya örtük olarak ("dönüş adresleri" biçiminde) temsil edilebilir.

bunu fna(fnb(x))yaptığınızda, devlete fna için bir durum oluşturacak bir devlet veriyorsunuz. Bu, xfnb çağrılmadan önce var olan gerçeğinden kaynaklanmaktadır (yani, kendi "geçmişinden" gelir).

Bu bir "devlet varlığı" ya da "devlet yok" meselesi değil. Bu bir "umrumda" veya "umrumda değil" materyali.


0

Durum, mevcut bir uyarana, sadece mevcut uyarana değil, geçmiş uyaranlara bağlı bir şekilde yanıt verme yeteneği anlamına gelir.

Tamamen işlevsel programlar sadece işlevlerdir. Böylece pratik uygulamalar için tamamen işlevsel program bir çift (old_state * present_stimulus) girer ve bir çift (new_state * present_response) verir. Bir sonraki uyarıcıyı beklemek ve durumu yaymak için harici, durum bilgisi olan bir "lüper" gereklidir.

Tamamen işlevsel bir programın özünde bir durumu yoktur ve doğrudan pratik uygulamalar için kullanılamaz.

Dolayısıyla, hiçbir devlet odaklı program tamamen işlevsel olan ve devletsiz farklı bir uygulama ile değiştirilemez.


0

Dış dünyayla etkileşime girmek zorunda olmadığınız sürece açıkça değişebilir durumdan kaçınabilirsiniz.

JavaScript'te programın aslında işlemci döngülerini üstlenmenin ötesinde bir etkisi olması için Dom veya Window nesnesini değiştirmeniz gerekir ve bu API'ler durum bilgisi içerir. Ancak, Dom ve Window nesnelerini JavaScript koduna parametre olarak geçiren ve daha sonra çıktı olarak yeni bir Dom / Window alan bir sarmalayıcı oluşturabileceğinizi varsayalım. Bu, JavaScript kodunu değiştirilebilir durumdan yalıtır.

Tabii ki hala devlete güveniyorsunuz , çünkü tarayıcı penceresi ve DOM doğası gereği durum bilgisi içeriyor. Herhangi bir etkileşimli uygulama doğası gereği durumsaldır, ancak kodunuzu açık durumu en aza indirecek şekilde yapılandırabilirsiniz.

Farklı bir soru, bunun iyi bir fikir olup olmadığıdır. Tasarım gereği saf işlevsel bir dil olan Haskell bile, değiştirilebilir durumu simüle etmenizi sağlayan 'devlet' monadını içerir. Bu, açıkça değişebilir durumun bazen gerçekten arzu edilen bir model olduğunu gösterir.


0

Durumu olmayan bir programlama dilinde "durum makinesini" nasıl uygulayacağınızı düşünün.

Büyük olasılıkla bunu yapabilirdiniz, ancak işlev adlarını depolama olarak kullanırsınız. Gobblyday gook ile bitirmek şöyle:

if (sm.atBegining()) sm.start() else if (sm.done()) sm.stop() ) else sm.progress()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.