Değişmezlik veya değişebilirlik fonksiyonel programlamada anlamlı bir kavram değildir.
Hesaplamalı bağlam
Bu son zamanlarda yapılan bir başka soruya ilginç bir takip (kopya değil) olan çok iyi bir soru: Atama, değerleme ve isim bağlama arasındaki fark nedir?
İfadelerinizi tek tek yanıtlamak yerine, burada size neyin tehlikede olduğuna dair yapılandırılmış bir genel bakış sunmaya çalışıyorum.
Size cevap vermek için dikkate alınması gereken birkaç konu vardır:
Fonksiyonel programlama tarzı aptalca görünüyor çünkü zorunlu bir programcı gözüyle görüyorsunuz. Fakat bu farklı bir paradigmadır ve zorunlu kavramlarınız ve algılamanız yabancıdır, yersizdir. Derleyicilerin böyle bir önyargısı yoktur.
Ancak son sonuç, makine öğrenimi de dahil olmak üzere tamamen işlevsel bir şekilde program yazmanın mümkün olduğu, düşünce fonksiyonel programlamanın veri depolama kavramına sahip olmadığı düşünülmektedir. Bu konuda diğer cevaplara katılmıyorum gibi görünüyor.
Umarım bu cevabın uzunluğuna rağmen birkaç kişi ilgilenecektir.
Hesaplamalı paradigmalar
Soru, teorik ve en basit temsilcisi lambda hesabı olan belirli bir hesaplama modeli olan fonksiyonel programlama (diğer adıyla uygulamalı programlama) ile ilgilidir.
Teorik düzeyde kalırsanız, birçok hesaplama modeli vardır: Turing makinesi (TM), RAM makinesi ve diğerleri , lambda hesabı, birleştirici mantık, özyinelemeli fonksiyon teorisi, yarı-Thue sistemleri, vb. Daha güçlü hesaplama modellerin neye hitap edebildikleri açısından eşdeğer olduğu kanıtlanmıştır ve bu
Kilise Turing tezinin özüdür .
Önemli bir kavram, modelleri Kilise-Turing tezine yol açan denkliklerin temelini oluşturan modelleri birbirine düşürmektir. Bir programcı bakış açısından bakıldığında, bir modeli diğerine azaltmak genellikle derleyici olarak adlandırılan şeydir. Mantıksal programlamayı hesaplama modeliniz olarak alırsanız, bir mağazadan satın aldığınız PC tarafından sağlanan modelden oldukça farklıdır ve derleyici, mantık programlama dilinde yazılmış programları PC'nizin temsil ettiği hesaplama modeline çevirir (hemen hemen RAM bilgisayarı).
Bununla birlikte, bu iki modelin işleri aynı şekilde yaptığı veya biri için anlamlı bir kavramın diğerine aktarılabileceği anlamına gelmez. Tipik olarak, bir TM'deki hesaplama adımı ile (β-) aralarında tercüme edilebilir olmalarına rağmen, Lambda Analizinde indirgeme adımı. Lambda ifadesinin optimal değerlendirmesi kavramı, TM modellerindeki karmaşıklık sorunlarından oldukça uzaktır.
Uygulamada, kullandığımız programlama dilleri, farklı teorik kökenlerden gelen kavramları bir araya getirme eğilimindedir ve bunu yapmaya çalışır, böylece bir programın seçilen bölümleri, uygun olduğunda bazı modellerin özelliklerinden yararlanabilir. Benzer şekilde, insanlar bina sistemleri, dilde eldeki göreve en iyi uyacak şekilde, farklı bileşenler için farklı diller seçebilir.
Bu nedenle, nadiren saf bir durumda bir programlama dilinde bir programlama paradigması görürsünüz. Programlama dilleri hâlâ baskın paradigmaya göre sınıflandırılır, ancak diğer paradigmalardan gelen kavramlar söz konusu olduğunda, genellikle ayrımları ve kavramsal konuları bulanıklaştıran dilin özellikleri etkilenebilir.
Tipik olarak, Haskell ve ML veya CAML gibi diller işlevsel kabul edilir, ancak zorunlu davranışa izin verebilirler ... Başka neden " tamamen işlevsel altkümeden bahsedelim?" "?
Daha sonra, bunu veya bunu fonksiyonel programlama dilimde yapabileceğinizi iddia edebilirsiniz, ancak ekstra fonksiyonel olarak kabul edilebilecek şeylere güvenirken fonksiyonel programlama ile ilgili bir soruyu gerçekten cevaplamıyor.
Cevaplar, ekstralar olmadan belirli bir paradigma ile daha kesin bir şekilde ilgili olmalıdır.
Değişken nedir?
Başka bir sorun terminolojinin kullanılmasıdır. Matematikte değişken, bazı alanlarda belirsiz bir değeri temsil eden bir varlıktır. Çeşitli amaçlar için kullanılır. Bir denklemde kullanıldığında, denklemin doğrulanması için herhangi bir değer olabilir. Bu vizyon, mantık programlamasında " mantıksal değişken " adı altında kullanılır , çünkü muhtemelen ad değişkeni mantık programlama geliştirilirken başka bir anlamı vardır.
Geleneksel zorunluluk programlamasında, bir değişken, bir değerin temsilini ezberleyebilen ve muhtemelen mevcut değerini başka bir değerle değiştirebilen bir tür kap (veya bellek konumu) olarak anlaşılır.
Fonksiyonel programlamada, bir değişkenin matematikte yaptığı gibi bir değer için yer tutucu ile aynı amaca sahiptir. Geleneksel zorunluluk programlamasında bu rol aslında sabittir ( değişmezlerle karıştırılmamalıdır) 123, true, ["abdcz", 3.14] gibi bu değer alanlarına özgü bir gösterimle ifade edilen değer olarak belirlenen değer ).
Her türlü ve sabit olan değişkenler tanımlayıcılarla temsil edilebilir.
Zorunlu değişkenin değeri değişebilir ve bu değişebilirliğin temelini oluşturur. Fonksiyonel değişken yapılamaz.
Programlama dilleri genellikle daha büyük varlıkların dilde daha küçük olanlardan oluşturulmasına izin verir.
Zorunlu diller, bu tür yapıların değişkenleri içermesine izin verir ve bu size değiştirilebilir veriler sağlar.
Bir program nasıl okunur
Bir program temelde algoritmanızın soyut bir tanımıdır, ister pragmatik bir tasarım ister paradigmatik olarak saf bir dil olsun, bir dildir.
Prensipte, soyutla ne demek istediğine dair her ifadeyi alabilirsiniz. Daha sonra derleyici bunu bilgisayarın yürütmesi için uygun bir forma çevirecektir, ancak ilk yaklaşımdaki sorun bu değildir.
Tabii ki, gerçeklik biraz daha zordur ve derleyicinin verimli yürütme için nasıl başa çıkacağını bilmeyeceği yapılardan kaçınmak için neler olduğu hakkında bazı fikirlere sahip olmak genellikle iyidir. Ama bu zaten optimizasyon ... hangi derleyiciler çok iyi olabilir, genellikle programcılardan daha iyidir.
Fonksiyonel programlama ve değiştirilebilirlik
Değişebilirlik, atama ile değiştirilecek değerleri içerebilecek zorunlu değişkenlerin varlığına dayanır. Bunlar fonksiyonel programlamada mevcut olmadığından, her şey değişmez olarak görülebilir.
Fonksiyonel programlama sadece değerlerle ilgilidir.
Değişmezlik hakkındaki ilk dört ifadeniz çoğunlukla doğrudur, ancak zorunlu görüşle zorunlu olmayan bir şeyi açıklayın. Her birinin kör olduğu bir dünyada renklerle tanımlamaya biraz benziyor. Fonksiyonel programlamaya yabancı kavramlar kullanıyorsunuz.
Yalnızca saf değerleriniz var ve bir tamsayı dizisi saf bir değerdir. Yalnızca bir öğede farklılık gösteren başka bir dizi elde etmek için farklı bir dizi değeri kullanmanız gerekir. Bir öğeyi değiştirmek sadece bu bağlamda var olmayan bir kavramdır. Bir diziyi ve bazı dizinleri bağımsız değişken olarak içeren bir işleviniz olabilir ve yalnızca dizinler tarafından belirtildiği yerde farklılık gösteren neredeyse aynı dizidir. Ancak yine de bağımsız bir dizi değeridir. Bu değerin nasıl temsil edildiği sizin probleminiz değil. Belki bilgisayar için zorunlu çeviride çok şey paylaşıyorlar ... ama bu derleyicinin işi ... ve ne tür bir makine mimarisi için derlendiğini bile bilmek istemiyorsunuz.
Sen yok kopya değerleri (hiçbir mantıklı, bu yabancı bir kavramdır). Yalnızca programınızda tanımladığınız etki alanlarında bulunan değerleri kullanırsınız. Ya bunları (değişmez değerler olarak) tanımlarsınız ya da bunlar, başka bazı değerlere bir işlev uygulamanın sonucudur. Aynı değerin programdaki farklı yerlerde kullanıldığından emin olmak için onlara bir ad verebilirsiniz (böylece bir sabit tanımlar). İşlev uygulamasının bir hesaplama olarak değil, verilen bağımsız değişkenlere yapılan uygulamanın sonucu olarak algılanması gerektiğini unutmayın. Yazma 5+2
veya yazma7
aynıdır. Önceki paragrafla tutarlıdır.
Zorunlu değişken yoktur. Atama yapılamaz. Adları atanabilir değişkenlere bağlayabileceğiniz zorunlu dillerden farklı olarak adları yalnızca değerlere (sabitler oluşturmak için) bağlayabilirsiniz.
Bunun karmaşıklıkta bir maliyeti olup olmadığı tamamen belirsizdir. Bir kere, karmaşıklık ile ilgili zorunluluk paradigmalarına atıfta bulunuyorsunuz. Fonksiyonel programınızı, tasarımcının amacı olmayan zorunlu bir program olarak okumayı seçmediğiniz sürece, fonksiyonel programlama için böyle tanımlanmamıştır. Gerçekten de fonksiyonel görüş, bu tür konular hakkında endişelenmenize ve hesaplananlara konsantre olmanıza izin vermemeyi amaçlamaktadır. Uygulamaya karşı biraz şartname gibi.
Derleyici, uygulamaya dikkat etmeli ve ne yapacaksa, ne yapacaksa donanıma en iyi şekilde uyarlanabilecek kadar akıllı olmalıdır.
Programcıların asla bunun için endişelenmediğini söylemiyorum. Ayrıca programlama dillerinin ve derleyici teknolojisinin olmasını istediğimiz kadar olgun olduğunu söylemiyorum.
Soruları cevaplama
Varolan değeri değiştirmeyin (uzaylı kavramı), ancak istendiği yerde farklılık gösteren yeni değerleri hesaplayın, muhtemelen bir ekstra elemana sahip bir liste.
Program yeni veriler alabilir. Bütün mesele bunu dilde nasıl ifade ettiğinizdir. Örneğin, programın giriş akışı olarak adlandırılan büyük olasılıkla boyutlandırılmamış belirli bir değerle çalıştığını düşünebilirsiniz. Orada oturması gereken bir değerdir (zaten tam olarak bilinip bilinmediği sorun değil). Ardından, akışın ilk öğesinden ve akışın geri kalanından oluşan bir çifti döndüren bir işleve sahipsiniz.
Tamamen uygulanabilir bir yolla iletişim bileşenlerinin ağlarını oluşturmak için kullanabilirsiniz (ortak programlar)
Makine öğrenimi, verileri toplamanız ve değerleri değiştirmeniz gerektiğinde başka bir sorundur. Fonksiyonel programlamada bunu yapmazsınız: sadece egzersiz verilerine göre uygun şekilde farklılık gösteren yeni değerleri hesaplarsınız. Ortaya çıkan makine de çalışacaktır. Endişelendiğiniz şey, zaman ve alan verimliliğini hesaplamak. Ancak, yine, bu farklı bir konudur, bu ideal olarak derleyici tarafından ele alınmalıdır.
Son açıklamalar
Yorumlardan veya diğer cevaplardan, pratik fonksiyonel programlama dillerinin tamamen işlevsel olmadığı açıktır. Bu, özellikle derleme söz konusu olduğunda teknolojimizin hala geliştirileceği gerçeğinin bir yansımasıdır.
Tamamen uygulanabilir bir tarzda yazmak mümkün mü? Cevap yaklaşık 40 yıldır biliniyor ve "evet". 1970'lerde ortaya çıktığı gibi anlamsal semantiklerin amacı, dilleri tamamen işlevsel bir stile çevirmek (derlemek), matematiksel olarak daha iyi anlaşılan ve böylece programların semantiğini tanımlamak için daha iyi bir temel olarak kabul edildi.
İlginç olan, değişkenler de dahil olmak üzere zorunlu programlama yapısının, veri deposu gibi uygun değer alanlarını tanıtarak işlevsel bir stile dönüştürülebilmesidir. Ve işlevsel stile rağmen, zorunlu bir şekilde yazılmış gerçek derleyicilerin koduna şaşırtıcı bir şekilde benzer kalır.