Hangi yaygın problemler için, işlevsel programlama uygun değildir? [kapalı]


22

İşlevsel programlama, bildirimsel bir paradigmadır. FP'li güçlerden biri, yan etkilerin önlenmesidir. Bazı problemler için FP'nin uygun olmadığı söylenir.

Hangi yaygın problemler için, işlevsel programlama uygun değildir?


Whew! Bir an için " kusurlu bir paradigma" dediğini sanıyordum . Sonra geri döndüm ve kontrol ettim.
Mark C

1
Bence yan etkilerin izole edildiğini (Haskell'de) kaçınılmaktansa daha doğru olduğunu düşünüyorum. Monad'lar durum değişikliklerine izin veriyor ve biri bile "Devlet" olarak adlandırılıyor.
Larry Coleman

Larry Coleman'ın açıkladığı gibi, işlevsel programlamanın yan etkilerden kaçındığı doğru değildir, ancak kullanımlarını caydırdığı ve bazı dillerde onları açıkça izole ettiği görülür. Örneğin, araştırma
Giorgio

Yanıtlar:


17

Doğada çok durumlu olan uygulamalar. Video oyunları güzel bir örnek çünkü gerçek dünyayı modelliyorlar. Her şey değiştiğinde önceki durumdan yeniden inşa etmek yerine, dünyadaki durumu değiştirmeyi düşünmek çok daha mantıklıdır.

Somut bir örnek, vurulduktan sonra canavarın sağlığını değiştiriyor olabilir. Sağlığını değiştirmek, şimdi daha az sağlık durumu dışında, her şekilde aynı olan tamamen yeni bir canavarla değiştirmekten çok daha mantıklı. Bu tür değişiklikler, bir oyun dünyasındaki hemen hemen her şeyi oluşturur ve bunu tamamen işlevsel bir şekilde yapmak pek sezgisel değildir. En azından tamamen işlevsel bir dilde yapıyorsanız, bazı önemli performans cezaları olabileceğini hayal ediyorum.

(Not olarak, oyunlardaki bazı problemler AI gibi fonksiyonel programlamaya çok uygundur. Hibrit bir işlevsel / zorunlu dil bu durumlar için mükemmel bir seçimdir.)


9
Yeni Başlıca Programlama Dilleri makalesi : Bir Oyun Geliştiricisinin Perspektifi , özellikle işlevsel davranışın varsayılan olduğu ve durum değişikliğinin hatalardan kaçınmak için türler arasında takip edildiği oyun geliştirme için bir pl'yi savunur. Dolayısıyla herkes fonksiyonel paradigmanın oyunların programlanması için doğal olarak uygun olmadığına inanmıyor.
sepp2k

1
@ sepp2k, bağlantı için teşekkürler. Gerçek oyunları yapan birisinin tartıştığı perspektifi gördüğüme sevindim.
Matt Olenik

3
@ sepp2k bekle, bir şey mi kaçırdım? Sunumu daha yakından okuduktan sonra, Sweeney, çekirdek motorun çoğunun tamamen işlevsel bir kodla yazılmasını ve oyun mantığının çoğunun zorunlu olarak yazılmasını (veya en azından izin vermesini) ve eşzamanlılığa yardımcı olmak için STM'yi kullandığını iddia ediyor gibi görünüyor. . Bu benim için çok makul görünüyor.
Matt Olenik

@Matt: Hayır, haklısın, oyun mantık bölümünün değişken durum içereceğini söylüyor. Ancak bu, dilin değişebilirliği izlemekten türlere ("musings" bölümünde önerdiği) engellemez. Tabii ki "türler yoluyla izleme durumu", "işlevsel" ifadesine eşit değil, bu yüzden önceki yorumumu biraz iyimser bir şekilde ifade etmiş olabilirim.
sepp2k

@ sepp2k doğru, ne demek istediğini anlıyorum.
Matt Olenik

17

Gerçek zamanlı gömülü programlama tamamen yan etkilerle ilgilidir. Dijital ve analog, zamanlayıcılar, seri ve paralel portlarla etkileşime giren, ilginç olan her şey yan etkileri olan fonksiyonlar çağırılarak yapılır.


3
Eğer sadece donanım arayüzünü kastediyorsanız, C / C ++ 'dan başka bir şey olduğundan şüpheliyim, iyi bir seçim. Ancak, Erlang gibi dillerin üstündeki katmanda, özellikle telekom sistemlerinde bazen kullanılır. Erlang, kritik ve hataya dayanıklı gömülü gerçek zamanlı sistemler için tasarlanmış işlevsel bir dildir.
Jonas

@Jonas: Erlang mutasyonu en aza indirebilir, ancak elbette bir yan etki olan mesajları iletmek IO'ya bağımlıdır.
Jon Harrop

11

GUI programlamanın işlevsel programlama için uygun olmadığını savunuyorum. GUI'ler genellikle çok durumludur ve yan etkisiz kullanmak yerine durumlarını kullanarak modellemesi / yönetimi çok daha kolaydır. GUI'ler için işlevsel bir programlama dili kullanmak kesinlikle mümkündür ... ama muhtemelen iyi bir fikir değildir.

Başka bir cevap belirtildiği gibi, oyunlar durumunu takip ederek yönetmek için genellikle daha kolaydır, ve sen ise edebilir işlevsel bir dilde bir oyun yazmak, ( "duruma özel" dilinde bunu genellikle daha kolaydır ve daha verimlidir yani bir nesne yönelimli dil).


-1: Saflıktan bahsediyorsunuz ve birinci sınıf işlevlerin kullanılmasını görmezden geliyorsunuz, örneğin GUI kodundaki geri çağrılar, saf olmayan FP dillerinde OOP dillerinden çok daha kolaydır.
Jon Harrop,

4
@Jon Harrop: Birinci sınıf fonksiyonlar, işlevsel programlama dilleri için benzersiz değildir. Yine de FP tarzının GUI'ler için uygun olmadığını savunuyorum.
mipadi

1
Kime sorduğuna bağlı. İşlevsel programcıların çoğu için birinci sınıf işlevler, işlevsel programlamanın tanımıdır.
Jon Harrop,

JON Harrop: Çoğu işlevsel programcı, işlevsel programlamanın, matematiksel fonksiyonların bileşimi ve değerlendirilmesi olarak programları tanımlamanın bir yöntemi olduğunu söyler. Birinci sınıf fonksiyonlar bu paradigmanın önemli bir parçasıdır, ancak birinci sınıf fonksiyonlar tek başına işlevsel bir programlama dili (veya işlevsel program) yapmaz. İşlevsel programlama paradigması, durum ve değişken veri yapılarının kullanımını en aza indirgemeye çalışır ve hatta FP dillerinin bu tarzı teşvik etmesini engeller. FP, birinci sınıf fonksiyonlar gibi bireysel özellikler olduğu kadar, bir programlama tarzı hakkında da ...
mipadi

... Bu paradigmanın GUI programlamaya özellikle uygun olduğunu anlamıyorum - nesne yönelimli diller genellikle konuşan GUI'ler için daha uygun.
mipadi

5

Veri odaklı iş uygulamaları. Kullanıcı arayüzü ve basit veri işlemlerinde FP gerekmez.


2
Ve gerçekten başka herhangi bir veri / görünüm uygulaması. Oyunların çoğunluğu tamamen devlet ve onu değiştirmekten ibarettir ve bu nedenle işlevsel bir stile çok iyi çevrilmemektedir.
Jon Purdy

18
Gerçekten mi? FP'nin özellikle bunun için iyi olacağını düşündüm . Verilerin seçilmesi, toplanması ve yansıtılması ile ilgili bu uygulamaların% 99'u gibi değil mi? Bu temelde filter, reduceve map. Bazı atmak sort, partition, groupBy. Sonuçta, bu tür uygulamaları yazmak için en çok kullanılan programlama dili Excel olduğunu ise fonksiyonel bir dil.
Jörg W Mittag

3
Veriye dayalı iş uygulamaları ve basit veri işlemlerine sahip uygulamalar FP için çok uygun gibi görünüyor ve FP'nin bu tür şeyler için popüler olduğunu duydum. Örn , Wall Street'teki Adventures fa fonksiyonel programcısını
Jonas

1
-1: FP'nin üstün olduğu bazı uygulamaları listeledik.
Jon Harrop

2

İşlevsel programlama için uygun olmayan herhangi bir problemi kendi başınıza kolayca kaldıramazsınız.

Bunların çoğu, işlevsel programlama için kullanılan gerçek dile ve özelliklerine bağlıdır.

Bir örnek, gerçek zamanlı gömülü sistemler için daha önce bahsedilen Erlang'dır.

Devlet doluluk da işlevsel programlamaya karşı iyi bir kriter değil, fonksiyonel programlama dillerinde bununla başa çıkmanın birkaç başarılı yolu var.

Fonksiyonel programlamaya karşı yan etkiler de sıklıkla dile getirilir. Tamamen solististik olmayan her programın yan etkileri vardır. Bu yüzden her gerçek dünya FP dili, bununla başa çıkmanın bir yolunu buluyor, bu sadece dünya yan etkilerini ne kadar zarif bir şekilde ele alacağımızla ilgili bir konu.

Genel değişkenler gibi rastgele yan etkilere gerek yoktur.

Ancak, işlevsel programlamaya girmeyi kolaylaştıran sorun kümeleri vardır, çünkü soruna tanıdık bakma şeklinizi değiştirmezler. Ancak işlevsel düşünmeyi başardığınızda, daha fazla sorun kümesi daha az yan etkilere açıktır.

C programlanırken bile, küresel değişkenler gibi isteğe bağlı yan etkileri mümkün olduğunca azaltmak her zaman iyi bir fikirdir.


GUI uygulamaları gibi durum-içi uygulamaların işlevsel bir şekilde yapılması zordur, ya da herhangi bir öneriniz var mı?
Jonas

Bir tür işlem / iş parçacığı soyutlamanız varsa (örn. Erlang'da olduğu gibi) durumunuzu bir işlem içinde geçirebilirsiniz.
Peer Stritzinger 28:10

3
GUI uygulamaları genellikle bir olay döngüsü etrafında kurulur. Bir etkinlik döngüsünü işlevsel bir dilde oldukça iyi yazabilirsiniz. Daha karmaşıksa, muhtemelen arka plan işlemesi için bazı başlıklar / işlemler ekleyeceksiniz. Ancak, bir tür işlem / iş parçacığı soyutlamanız varsa (örneğin Erlang'da olduğu gibi) durumunuzu kolayca bir işlem içinde geçirebilirsiniz. Devamlar da kullanışlı olabilir. Ben sadece GUI'leri ele almak için fonksiyonel bir şekilde şeyler yapmaya alışmak olduğunu düşünüyorum. Günümüzde GUI programlamanın zor olmasının bir nedeni, çoğu araç setinin işlevsel kullanım için tasarlanmamış olmasıdır.
Peer Stritzinger

1
@Jonas: Haskell'de, ya IO monadını, State monad'ı ya da bir kombinasyonunu kullanırsınız.
Larry Coleman

1
@Jonas: Bu sizin faydalı tanımınıza bağlıdır. Vikikitap örneği wxHaskell kullanırken Gerçek Dünya Haskell gtk2hs kullanıyor. Haskell uygulamam komut satırı tabanlı olduğundan, hiç denemedim.
Larry Coleman
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.