İşlevsel Dillerdeki Harfler ve Ayarlayıcılar


9

Fonksiyonel Programlamanın ilkelerinden biri Saf Fonksiyonların kullanılmasıdır. Saf işlev, yan etkisi olmayan ve referans olarak saydam olan bir işlevdir.

Harfler referans olarak saydam değildir - Alıcıya yapılan çağrılar arasında bir Setter çağrılırsa, parametreleri olmasa bile Getter'in dönüş değeri değişir (genellikle parametre yoktur)

Setters yan etkiler üretmek - Bir Setter tipik olarak dönüş değeri olmayan bir değer işleyen çağrılması (aslında, geleneksel olarak ayarlayıcı döner bir şey)

Scala'da iki paradigmayı bir araya getirdiğimizi (işlevsel ve nesne yönelimli) kabul ediyoruz ve Java gibi bir dilde yaptığımız gibi getters / setters kullanıyoruz.

Haskell gibi bir dilde (akıcı değilim, ama "Saf" işlevsel bir dile daha doğru tutulduğu söylendi) Sadece merak ediyorum, Getters'ın referans olarak saydam ve Setters gibi nesneler üzerindeki özellikleri nasıl modelleyeceğinizi merak ediyorum yan etkisi yoktur?

Çözüm, ayarlayıcının döndürülen değerin ayarlayıcı dönüş değeri olarak çağrıldığı nesnenin bir kopyasını geri vermek mi ve bu kopya özellik değerinde değişiklik içeriyor mu?


8
Genellikle örtülü olsa bile - - Alıcılar ve ayarlayıcılar parametre olarak nesne var bu yüzden getters vardır referentially şeffaf.

@delnan, yalnızca okuduğu özellik değişmezse.
dan_waterworth

3
@dan_waterworth: Yalnızca nesne kimliği olarak "referans olarak saydam" daki "aynı" kelimesini okursak. Altta yatan özniteliğin farklı olması, onu farklı argümanlarla (eşitlik tanımlarının çoğu ile aynı doğrultuda) bir çağrı yapar. Bu, bir ayarlayıcıyı çağıran ve alıcıya çağrı ile alıcıyı bitirme arasında bitiren başka bir iş parçacığını görmezden geliyor, ancak bu durumda yine de daha ciddi sorunlarınız var.

Yanıtlar:


7

Kesinlikle. Vaka sınıfı yöntemine copyveya genel lens konseptine bakın.

Özellikle, devletin değişmesi gerekiyorsa, bir Devlet monad kullanırsınız. Bu durum monadında değişiklikler, "durum" dan bilgi almayı ve değiştirmeyi kolaylaştıran lensler aracılığıyla yapılabilir.

Ayrıca "devlet" gibi derin bir yapıdan gelen ve bu konuda değişiklikler yapan genel sorun hakkındaki bu soruya bakınız . Eğer daha derine inmek istiyorsanız cevapların hem lenslerde hem de fermuarlarda iyi bağlantıları vardır.


Soru Daniel: copy () öğesinin Case sınıflarına bağlı olmasının belirli bir nedeni var mı? Bu, özel olarak Case sınıflarının ihtiyaçlarına (yanlış kelime, ancak başka bir şey düşünemiyorum) özgü görünmüyor, (bana göre) tüm sınıflar için daha uygun bir özellik gibi görünüyor. Vaka olmayan sınıfımda copy () kullanmam gerekirse ne olur? Bu işlevselliği elde etmek için kullanabileceğim bir özellik var mı?
ThaDon

1
@TaDon vaka sınıflarının yapıcı parametreleri tarafından tanımlanması gerekir - eşitlikleri, karma kodu ve çıkarıcısı bu varsayımı temel alır ve kopyalama yöntemi de geçerlidir. Büyük / küçük harf olmayan sınıflarda, bir sınıfı kopyalamak için gereken tek şey yapıcı parametrelerinin olup olmadığını herkes tahmin eder. Ancak kendi kopyalama yönteminizi kolayca yazabilirsiniz.
Daniel C. Sobral

11

Eh, Haskell, nesneler (genellikle) değişmez gaz gidericiler (eğer kayıt sözdizimi kullandığınızda olsun) veya fonksiyonlar böylece alıcılar gibi hareket olduğunu vardır vardır referentially şeffaf. Ve sonra nesneler üzerinde değerleri "ayarlamazsınız" - eğer herhangi bir şey eskisine benzer, ancak alanlardan biri için farklı bir değere sahip yeni bir nesne oluşturursanız. Bu aynı zamanda saf bir işlevdir.


1
"nesneler (genellikle) değişmez" değiller mi?
sara

-1

"Harfler ve ayarlayıcılar nesneye parametre olarak sahiptir - genellikle örtük olsa da - bu nedenle alıcılar referans olarak saydamdır. - delnan"

Referans olarak şeffaf, DAİMA işlevinin aynı girişler için aynı çıktıyı döndürdüğü anlamına gelir; bir nesne özniteliği bir ayarlayıcı tarafından değiştirildiyse, aynı çıktıyı döndürmezsiniz. :)


Ancak, nesne bir ayarlayıcı tarafından değiştirildiyse, alıcıya (yani örtük öz argüman) girdi değişmiştir.
Stephen C. Steel

1
Nesne yığın üzerinde hareket ettirilmedikçe, nesne başvuru değeri / işaretçisi değişmemiştir.
Casey Hawthorne

5
Evet, ancak mantıksal olarak, örtük girdi, işaretçinin değeri değil nesnenin kendisidir.
Stephen C. Steel

"bir nesne özniteliği bir ayarlayıcı tarafından değiştirildiyse, aynı çıktıyı döndürmüyorsunuz": İşlevsel olarak, ilk nesneyi yok ettiniz ve yeni bir nesne yarattınız. Performans nedenleriyle (eski nesneden yeni nesneye referansların kopyalanmasından ve güncellenmesinden kaçının), yeni nesneyi eski nesneyi içeren aynı bellek alanında saklıyorsunuz.
Giorgio
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.