Fonksiyonel programlamanın faydaları nelerdir? [kapalı]


97

Fonksiyonel programlamanın faydalarının neler olduğunu düşünüyorsunuz? Ve bugün programcılara nasıl başvuruyorlar?

Fonksiyonel programlama ve OOP arasındaki en büyük farklar nelerdir?



Yanıtlar:


75

Fonksiyonel programlama tarzı, nasıl elde edileceğinden çok ne istediğinizi tanımlamaktır. yani: bir yineleyici değişkenle bir döngü oluşturmak ve her hücreye bir şeyler yapan bir dizi boyunca ilerlemek yerine, "bu etiket, bu işlevin tüm hücrelerde yapıldığı bu dizinin bir sürümünü ifade eder elementler."

Fonksiyonel programlama, daha temel programlama fikirlerini, liste anlama ve önbelleğe alma gibi fikirleri derleyiciye taşır.

İşlevsel programlamanın en büyük yararı kısalıktır, çünkü kod daha kısa olabilir. İşlevsel bir program, bir döngünün merkezi olacak bir yineleyici değişkeni oluşturmaz, bu nedenle bu ve diğer türden ek yükler kodunuzdan çıkarılır.

Diğer büyük fayda, eşzamanlılıktır ve bu, işlevsel programlamayla daha kolay yapılır çünkü derleyici, durum değişkenlerini (bir döngüdeki yineleyici gibi) manuel olarak ayarlamayı gerektiren işlemlerin çoğuyla ilgilenir.

Programın yazılma şekline bağlı olarak, bazı performans avantajları tek işlemci bağlamında da görülebilir, çünkü çoğu işlevsel dil ve uzantı tembel değerlendirmeyi destekler. Haskell'de "bu etiket tüm çift sayıları içeren bir diziyi temsil eder" diyebilirsiniz. Böyle bir dizi sonsuz büyüklüktedir, ancak bu dizinin 100.000'inci elemanını istediğiniz zaman - dizi başlatma zamanında - tam da ihtiyacınız olan en büyük değerin ne olduğunu bilmenize gerek kalmadan isteyebilirsiniz. Değer, yalnızca ihtiyacınız olduğunda hesaplanacak ve daha fazla olmayacaktır.


13
İlk paragrafınızın işlevsel programlamadan çok Prolog gibi bildirimsel ilişkisel programlamayı açıklamaya daha yakın olduğunu hissediyorum.
McPherrinM

6
@McPherrinM: İşlevsel diller zorunlu değil bildirimseldir.
Lie Ryan

2
Prosedür ve FP ile DP ile IP'yi karıştırıyorsunuz gibi görünüyor . FP, işlev bileşimini vurgulayarak, yani deterministik bir hesaplamanın alt hesaplamaları arasındaki bağımlılıkları ayırarak endişelerin ayrılmasını sağlar.
Shelby Moore III

2
@LieRyan yanlış. Lütfen önceki
yorumumdaki

Eşzamanlılık, zorunlu olan, birbirleriyle etkileşime girebilecek birden fazla iş parçacığına sahip olmaktır. Aynı anda birden fazla bağımsız hesaplama yapmaya paralellik denir . Bkz. En.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy

29

En büyük yararı, alıştığınız gibi olmamasıdır. Scheme gibi bir dil seçin ve onunla problemleri çözmeyi öğrenin ve zaten bildiğiniz dillerde daha iyi bir programcı olacaksınız. İkinci bir insan dili öğrenmek gibi. Başkalarının temelde kendi başınıza bir varyasyon olduğunu varsayarsınız çünkü onu karşılaştıracak hiçbir şeyiniz yok. Başkalarına, özellikle zaten bildiklerinizle ilgili olmayanlara maruz kalmak öğreticidir.


28
bu, paradigmanın kendisinin bir yararı değil, onu öğrenmenin bir yararı
Moe

2
Ama gerçekten ayrı mı? Asıl soru soran kişinin bakış açısından, hayır diyebilirim - büyük olasılıkla işlevsel bir dil öğrenmek için toplam çaba harcamaktan fayda arıyorlar.
Kendall Helmstetter Gelner

3
"bu, paradigmanın kendisinin bir yararı değil, onu öğrenmenin bir yararıdır". Paradigma, diğer OOP çalışmalarınıza sızacak ve oradaki geliştirmenizi basitleştirmeye yardımcı olabilir. Problemlere "bekle --- oradaki bazı paylaşılan değişkenin durumu neydi?" ve "Bu prosedürleri doğru sırada yerine getirdim mi?". Cidden, Python, C #, C ++, Java'da (FP paradigmasını anlamaktan) bu avantajları elde edersiniz, adını siz verin.
Jared Updike

11

Neden İşlevsel Programlama Önemlidir
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Öz

Yazılım giderek daha karmaşık hale geldikçe, onu iyi yapılandırmak gittikçe daha önemli hale geliyor. İyi yapılandırılmış yazılımın yazılması ve hata ayıklaması kolaydır ve gelecekteki programlama maliyetlerini azaltmak için yeniden kullanılabilecek bir modül koleksiyonu sağlar.

Bu yazıda, özellikle işlevsel dillerin iki özelliğinin, üst düzey işlevlerin ve tembel değerlendirmenin modülerliğe önemli ölçüde katkıda bulunabileceğini gösteriyoruz. Örnek olarak, listeleri ve ağaçları işliyoruz, birkaç sayısal algoritma programlıyoruz ve alfa-beta buluşsal yöntemini (oyun oynama programlarında kullanılan Yapay Zekadan bir algoritma) uyguluyoruz. Modülerliğin başarılı programlamanın anahtarı olduğu için, fonksiyonel programlamanın yazılım geliştirme için önemli avantajlar sunduğu sonucuna vardık.


10

Bu nedenle iyi bir başlangıç ​​noktası, zorunlu dillerde mümkün olmayan ancak işlevsel dillerde mümkün olan bazı şeyleri anlamaya çalışmak olacaktır.

Hesaplanabilirlikten bahsediyorsanız, elbette işlevsel ancak zorunlu programlamada mümkün olan hiçbir şey yoktur (veya tam tersi).

Farklı programlama paradigmalarının amacı, daha önce mümkün olmayan şeyleri mümkün kılmak değil, daha önce zor olan şeyleri kolaylaştırmaktır.

İşlevsel programlama, kısa, hatasız ve paralelleştirilebilir programları daha kolay yazmanıza izin vermeyi amaçlar.


5

Biri veya diğeri olmak zorunda değil: C # 3.0 gibi bir dil kullanmak, her birinin en iyi öğelerini karıştırmanıza olanak tanır. OO, sınıf düzeyinde ve üzerinde büyük ölçekli yapı için, Yöntem düzeyinde küçük ölçekli yapı için İşlevsel stil için kullanılabilir.

İşlevsel stilin kullanılması, kontrol akışı ifadeleriyle karıştırılmadan, amacını açıkça belirten kodun yazılmasına olanak tanır. Yan etkisiz programlama gibi ilkeler nedeniyle, kod hakkında akıl yürütmek ve doğruluğunu kontrol etmek çok daha kolaydır. .


5

Bence işlevsel programlama ihtiyacının en pratik örneği eşzamanlılıktır - işlevsel programlar doğal olarak iş parçacığı açısından güvenlidir ve çok çekirdekli donanımın yükselişi göz önüne alındığında bu son derece önemlidir.

İşlevsel programlama aynı zamanda modülerliği de arttırır - çok uzun olan zorunlu yöntemlerde / işlevleri sıklıkla görebilirsiniz - neredeyse hiçbir zaman bir işlevi birkaç satırdan daha uzun görmezsiniz. Ve her şey ayrıldığından - yeniden kullanılabilirlik çok geliştirildi ve birim testi çok çok kolay.


3

Program büyüdükten sonra, kelime dağarcığımızdaki komutların sayısı çok yükselir ve kullanımı çok zorlaştırır. Nesne yönelimli programlamanın hayatımızı kolaylaştırdığı yer burasıdır, çünkü komutlarımızı daha iyi bir şekilde düzenlememize izin verir. Müşteriyi içeren tüm komutları bazı müşteri varlıkları (bir sınıf) ile ilişkilendirebiliriz, bu da açıklamayı çok daha net hale getirir. Bununla birlikte, program hala nasıl ilerlemesi gerektiğini belirten bir komut dizisidir.

Fonksiyonel programlama, kelime dağarcığını genişletmenin tamamen farklı bir yolunu sağlar. Yeni ilkel komutlar eklemekle sınırlı değil; ayrıca bir program oluşturmak için komutları nasıl bir araya getirebileceğimizi belirten yeni kontrol yapıları ekleyebiliriz. Zorunlu dillerde, komutları bir sırayla veya döngüler gibi sınırlı sayıda yerleşik yapı kullanarak oluşturabildik, ancak tipik programlara bakarsanız, yine de birçok yinelenen yapı göreceksiniz; komutları birleştirmenin yaygın yolları


1

Fonksiyonel programlamayı bir "ihtiyaç" olarak düşünmeyin. Bunun yerine, zihninizi açacak başka bir programlama tekniği olarak düşünün, tıpkı OOP, şablonlar, montaj dili vb. Onları öğrendiğinizde (eğer) düşünme şeklinizi tamamen değiştirmiş olabilir. Sonuçta, işlevsel programlamayı öğrenmek sizi daha iyi bir programcı yapacaktır.


0

Fonksiyonel programlamayı bilmiyorsanız, öğrenmek size problemleri çözmeniz için daha fazla yol sunar.

FP, işlevleri birinci sınıf değerlere yükselten basit bir genellemedir, oysa OOP, büyük ölçekli kod yapılandırması içindir. Bununla birlikte, OOP tasarım modellerinin birinci sınıf işlevler kullanılarak doğrudan ve çok daha kısa ve öz bir şekilde temsil edilebildiği bazı çakışmalar vardır.

OCaml, C # 3.0 ve F # dahil olmak üzere birçok dil hem FP hem de OOP sağlar.

Şerefe, Jon Harrop.

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.