İşlevsel programlamaya karşı en güçlü görüşünüz nedir? [kapalı]


25

İşlevsel programlama , en eski programlama paradigmalarından biridir. Ancak, sektörde daha popüler paradigmalara kıyasla çok kullanılmaz. Ancak, akademi'de büyük ölçüde vurgulanmıştır.

İşlevsel programlamaya karşı en güçlü görüşünüz nedir?


5
LINQ? .NET delegeleri? Mathematica gibi DSL'ler?
Jon Harrop

5
Bu arada, "işlevsel programlama" terimi farklı insanlar tarafından farklı anlamlara gelmek için kullanılır, bu nedenle hangi anlam kullandığınızı netleştirmeniz gerekir.
Jon Harrop

2
İşlevsel kod tabanınıza kod yazacak hiçbir zaman asla bulamazsınız. Yetenek havuzunu sınırlamak iyi bir iş kararı değil.
Patrick Hughes,

Yanıtlar:


52

Sorun en yaygın kod doğal olarak devlet olduğunu içerir - iş uygulamaları, oyunları, UI, vb ile hiçbir problem var bazı bir uygulama tamamen fonksiyonel olmanın parçaları; Aslında çoğu uygulama en az bir alanda fayda sağlayabilir. Ancak paradigmayı her yere zorlamak karşı sezgiseldir.


19
Kesinlikle. Saf fonksiyonel programlama, durum odaklı uygulamalar için uygun DEĞİLDİR. Bu yüzden ikisini birden yapabilen hibrit dilleri seviyorum. İşlevsel problemler için işlevsel paradigmalar, zorunlu problemler için zorunlu paradigmalar kullanın.
Matt Olenik

8
Kabul! Devlet, programlamanın önemli bir parçasıdır. Bu yüzden, Haskell'in bile, FP dillerinin en saf olanı, devlet ve IO kullanımına izin vermesine neden olur - sadece IO kodu / değişken durum kodu ile saf kod arasında bir test uygular ve test ve anlama kolaylığı için çok iyidir. .
Bill

8
Bu yüzden Haskell'i seviyorum. Bu durum kodunu en aza indirgemeyi teşvik eder. OO'da yeniden kullanılabilir, anlaşılması kolay ve kodları test etmek kolay yazmayı hedefliyorum. Çoğu zaman kodla bitirdiğimde Haskell'de çok farklı şeyler yazmam.
LennyProgrammers

4
"sadece IO kodu / değişken durum kodu ile test için çok iyi olan saf kod arasında bir ayrım uygular". Yazım sistemini bozmadan veya monad sürünme yapmadan hata ayıklama mesajları bile yazdıramazsınız.
Jon Harrop

2
Muhtemelen saf bir işlev programı, dünyayı çalıştırarak tamamen değişmeyecek mi?
Martin Beckett

24

İşlevsel programlamanın sorunu işlevsel programlamanın kendisi değildir - bunu yapan insanların çoğu (ve daha da kötüsü) içinde bunu yapan dilleri tasarlayanların çoğu.

Sorun, çok akıllı olmasına rağmen (bazen düpdüz parlak) çok fazla insanın, saflık, mükemmellik ve dünyaya yönelik kendi (genellikle oldukça dar) görüşlerini uygulama ve dünyaya programlanma konusunda biraz fanatik olmasından kaynaklanıyor. dil ve onu kullanan herkes.

Sonuçlardan biri uzlaşılamamasıdır. Bu, (diğer şeylerin yanı sıra) kabaca 10.000 dile ve rahatsız edici durumdan yeterince farklı olan lehçelere, ancak birisinin diğerlerine göre gerçekten önemli bir avantaja sahip olması için nadiren yeterince farklı olan lehçelere yol açar. Birçoğu ayrıca gerçek dünyaya bakar ve fonksiyonel modele çok iyi uymadığından temelde sadece yanlış ve en iyi göz ardı edildiğine karar verir.

Uzlaşma yetersizlik da sorunun belirli bir tip (veya sorunların birkaç belirli türleri) için kesinlikle güzel ama gerçekten epeyce dillere yol açmıştır emmek başkalarının bir sürü için. Bunların bir kısmı muhtemelen işlevsel modelin kendisinden kaynaklanıyor, ancak daha çok (en azından benim için) bu alana başlamak için çeken temel kişilik tipinden kaynaklanıyor gibi görünüyor.

Bu bir dizi soruna yol açar. Her şeyden önce, "işlevsel programlama" öğrenmek çoğunlukla felsefi bir değerdir. Diğer dil türlerinin çoğunda, belirli bir türün bir dilini bilmek, bir başkasını öğrenmek için çok önemlidir. Projem XI dilini kullanıyorsa, Y dilini bilen birini (ancak X'i değil) oldukça güvenli bir şekilde işe alabilir. İşlevsel dillerle bu daha az doğru. Erlang'ı çok iyi tanıyor olabilirsin ama yine de Haskell monadlarını tamamen yabancı ve anlaşılmaz buluyorlar.

Dillerin sayısını, aralarında sınırlı yetenek taşınabilirliği ile birleştirin ve çirkin bir durum elde edersiniz: Bir dilin ya da lehçenin, makul bir şekilde genel kullanımı için gereken "kritik kütleyi" oluşturması neredeyse imkansızdır. Bu yavaş yavaş değişiyor, ama çok Linux baskın masaüstü işletim sistemi olma gibi hala - insanlar argümanlar ikna ile gelip, her yıl sonunda bu olacak yıl - ve sadece insanlar gibi her öngörüyor oldum kim onlarca yıl şimdi, yine yanlış olacaklar. Bu, her ikisinin de asla olamayacağı anlamına gelmez - sadece tahminlere bakan ve "bu yıl olmaz" diye düşünen insanların şu ana kadar haklı oldukları kişilerdi.


4
Belki daha işlevsel diller olsaydı, fonksiyonel diller arasında daha fazla geçit olurdu.
Barry Brown

5
Bu saflık olmadan "işlevsel" olamazsın. Çizgiyi geçtikten sonra, tüm konsept dağılır ve hiçbir avantajı olmayan dağınık, paralel, standart bir dille sonuçlanır.
Patrick Hughes,

7
Öyleyse ilk probleminiz, işlevsel dillerin birbirlerine göre bir avantaj sağlayacak kadar farklı olmaması ve ikinci probleminiz arasında kolayca dolaşamayacak kadar farklı olmaları mı?
Tikhon Jelvis

2
Bana göre, bu cevap bir rant gibi okuyor. Bazı örnekler vermek olsaydınız, tartışmanız çok daha zorlayıcı olurdu.
Benjamin Hodgson

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...Hayır, bu tüm işlemsel dillere benziyor. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python, liste uzayıp gidiyor - hepsi gerçek sorunları çözmeyen sadece C sıkıcı yinelemeleri. Bu ranty cevabını tamamlayan benim bence düşüncem: D
cat

17

Fonksiyonel programlamanın çok yaygın kullanılmamasının sebebi, çok fazla yol almasıdır. Örneğin, Lisp veya Haskell'e ciddi bir göz atmak zor, "bütün bu dil büyük bir soyutlama çevrimidir" demeden. Kodlayıcının gerektiğinde altını çizemediği temel soyutlamaları oluşturduğunuzda, dilin basitçe yapamayacağı şeyleri belirlersiniz ve dil ne kadar işlevsel olursa, sahip olma eğilimi o kadar artar.

Mesela Haskell'i ele alalım. İşlevsel saflık adına, herhangi bir şeyle etkileşime giren her bir bilgisayar programının en temel iki bölümü olan devleti ve G / Ç'yi yönetmek için kimsenin anlamadığı beyin kırma soyutlamaları kullanmanız gerekir ! Bu hızlı yaşlanır.


9
+1, bazen zorunlu seviyeli zorunluluk dillerinde program yaparken de aynı şekilde hissediyorum. Örneğin, fsck'in neden C'deki gibi bir işlev işaretçisi kullanmak yerine Java'da tek bir yöntem arabirimi uygulayan tek bir yöntem sınıfı yapmam gerekiyor?
dsimcha

14
Bu soyutlamaların “altına giremeyeceğin” olmadığını söyleyebilirim, daha çok işi gerekir. Muz toplamaya ve zorunlu bir dilde yemeye alışkınız; Haskell (örneğin) ilk önce 20 sayfalık bir form doldurmanızı sağlar, çünkü hiç bir muzun bakmadığınızda gizemli bir şekilde yenilmeyeceğini garanti eder. Bu muzları düşünürken yardımcı olur, ama bazen sadece açsınız.
j_random_hacker

4
@ dsimcha: Bu, üst düzey zorunlu dillerdeki bir eğilimden ziyade, bir Java özelliğidir. Aslında, yüksek seviyeli dillerin birinci sınıf nesne olarak işleve sahip olma olasılığı daha yüksektir.
Muhammad Alkarouri 28:11

3
Haskell'deki monadların gerekliliği, işlevsel saflıktan değil, yan etkilerin ve tembel değerlendirmenin birlikte harika lezzetler göstermeyen iki harika tat olması gerçeğinden kaynaklanıyor. Monadlar sıralı değerlendirmeye zorlar. (Gerçekten, Hesaplama Yapıcıları ya da başka bir şey olarak adlandırılmalılar. 'Monad', kategori teorisyeni dışındaki herkes için berbat bir isimdir.) Ve monalları olmadan (bilerek kullanarak) FP'yi mutlu bir şekilde yapabilirsiniz!
Frank Shearar

4
Unutulmaması gereken bir şey: bu "soyutlama çevrimleri" göz önüne alındığında, dil daha sınırlı olabilir, ancak derleyici ve çalışma zamanı kodunuzla ilgili daha fazla garantiye sahiptir ve daha fazlasını yapabilir. Bu sadece bir çöp toplama gibidir - bir gc dilinde, sadece boş alan yaratamazsınız (ki yararlı olabilir), fakat bunun karşılığında, çalışma zamanı tüm hafızanızı sizin için potansiyel olarak el ile yapabileceğinizden daha verimli bir şekilde yönetebilir. İşlevsel saflıkla aynı.
Tikhon Jelvis

8

Tüm saygımla, sorunuzun kötü niyetli olduğunu düşünüyorum. İşlevsel programlama bir araç ya da belirli sorunların çözümü için yararlı bir araç setidir. Bununla ilgili bir görüşe sahip olmak yalnızca belirli bir problem veya uygulama bağlamında anlamlıdır. Genel olarak bu konuda bir görüş sahibi olmak, pense veya anahtarlara karşı bir görüş sahibi olmak gibidir.


4
Bu mantıksal olarak geçerli bir nokta, ancak OP'nin sorusunun son cümlesine "sıkça karşılaştığınız programlama problemleri için" dokunarak düzeltilebilir. (Bireysel okuyucuların, ne olduklarını tanımlamaları kaydıyla farklı sorunlarla karşılaşması önemli değildir.)
j_random_hacker

4

Ben uzman olsaydım bile, ticari bir ürün için işlevsel bir dili kullanmamın nedeni, yaygın olarak anlaşılmamasının basit bir nedenidir ve işin büyümesini beklemem durumunda, diğer geliştiricilerin yeteneklerini bulma becerisi konusunda endişeliyim. zaman içinde sürdürülmesi veya uzatılması.

Bu düşünülemez bir şey değildir ve muhtemelen daha yüksek bir geliştirici standardı elde edersiniz, çünkü gerçek bir korsanlık becerisine sahip olmayan bir javaschool mezunu, bu tür bir projede nereden başlayacağını bilemez, ancak yetenekli geliştiricilerin sınırlı havuzu kesinlikle gerekli bir değerlendirme olacaktır. iş açısından.


2

Market zamanı

Tam bir IT prosedür prosedür kodunu ve mantralarını kaldırmak zor.


1
İşlevsel programları test etmek genellikle daha kolaydır. Ve onlar daha kısa. Yani katılmıyorum. Sanırım "Funtional programlamaya geçmeye karşı en güçlü fikrin nedir?"
Jonas


2

her şeyden önce devlet-programlama ve fp ile ilgili herhangi bir tartışmayı kabul etmiyorum. haskell'deki Devlet monadını inceleyin ve devletin kodunuz üzerindeki etkisini değerlendirmek için ilginç yeni yollar bulacaksınız.

fp'ye karşı anlamlı bir tartışma yapacak olsaydım, haskell gibi ciddi bir işlevsel dili öğrenmek, bir formül bir araba kullanmayı öğrenmek gibi bir şey olur… heyecan verici ve eğitici, ancak günlük endüstriyel kodlama için ne yazık ki işe yaramaz çünkü, ortalama olarak İş arkadaşlarınız camrys kullanıyor ve bunu yapmaktan çok mutlular. fp dostu bir ortamda iş bulmak hala çok zordur ve kişi kendi başına grev yapmak veya tanınmış fp uygulayıcılarından bazılarını araştırmak istemiyorsa, bu değişimin olmadığını görüyorum.

Sanırım cevabım bana bir fp fanboy olarak geldi. neden olmamalısınız diye endişelenmeden önce haskell gibi gerçek bir fp dili vermeyi öneriyorum.


6
Sanırım ilk paragrafınız FP zihniyetinde neyin yanlış olduğunu açıklıyor. Biz yok istiyorum "Bizim kodu devletin etkisini değerlendirmek için ilginç yeni yollar." Bu ne anlama geliyor? Biz sadece devletin orada olmasını ve kolayca erişilebilir olmasını istiyoruz çünkü aslında işleri halletmek için
Mason Wheeler

2
Ben sürdüğüm Camry'nin sorunları var, ancak alanın altında sürekli sızıntı olup olmadığını kontrol etmemi gerektirmiyor . Haskell daha o dile gibidir görünüyor bir F1 arabası gibi, ama aslında zaman sürekli süre için yüksek devir yapamaz. :-P
j_random_hacker

1
@Mason Wheeler: "Devletin kodumuz üzerindeki etkisini değerlendirmek için ilginç yeni yollar istemiyoruz." Bunun yerine, istenmeyen bir yan etki nedeniyle çok kötü bir hatayı bulmak için bir hafta harcamayı tercih ediyoruz (kişisel deneyimimden konuşuyorum).
Giorgio,

@brad clawsie: FP'de yan etkilerin kontrol altına alınmasının tümünün kodlamayı çok daha üretken hale getirebileceğini düşünüyorum: yazması daha uzun zaman alıyor ancak düzeltmesi daha az zaman alıyor. Maalesef, ilk önce öğrenmeye epeyce çaba sarf etmek zorunda ve birçok programcı bu uzun vadeli düşünceye sahip değil: işlerin hızlı bir şekilde yapılması gerekiyor. İlk seferinde doğru şekilde yapmak için zaman yoktur, ancak daha sonra her zaman hata ayıklamak ve düzeltmek için zaman vardır. :-)
Giorgio

@Mason Wheeler: İşlevsel bir bakış açısıyla, paylaşılan bir duruma sahip olmak yalnızca optimizasyon amaçları için kullanışlıdır: değerleri kopyalamak çok fazla zaman ve hafıza alır, böylece gereksiz kopyalamayı önlemek için bir veri nesnesini paylaşırsınız. Ancak, paylaşılan bir durumu baştan itibaren kural olarak uygulamak, bir tür erken optimizasyondur.
Giorgio,

2

Ben büyük bir hayranıyım ve işlevsel programlamanın savunucusuyum. Ama işte noktalarım:

  • öğrenmesi kolay
    python ve ruby ​​gibi programlama dilleri (ve diğer birçok dil) öğrenmesi kolaydır. Gelişmiş fonksiyonel programlama, Haskell, Agda, Coq, ATS, vb. Dillerle öğrenmek oldukça zordur. Bazıları “matematiksel yapısal programlama” terimini kullanır. Eğer kategori teorisi ve soyut matematiğe aşina iseniz kolay, fakat örneğin "monad" lerin ne olduğu hakkında hiçbir fikriniz yoksa, oldukça işe yarar.

  • bir kodlama dili ile programlama daha fazla verimlilik anlamına gelebilir.
    Bazı durumlarda python ve ruby ​​gibi betik dilleri kullanmak daha fazla üretkenliğe yol açabilir. Bu, farklı prototipleri veya kütüphaneleri hızlı prototipleme ve yapıştırma anlamına gelir. Dinamik dilleri kullanmak (örneğin dinamik nesne yönelimli programlama) bu bağlamda iyi bir şey olabilir. Genellikle statik yazma daha iyidir, ancak dinamik türlerle komut dosyası yazmanın olumlu bir etkisi olabilir.

  • iş ile ilgili konular
    Programlama, başarılı bir yazılım projesinin yalnızca küçük bir alt kümesidir. Yazılımın çalışması gerekiyor, kullanıcıların mutlu olması gerekiyor ve bu mutlaka kullanılan programlama diline bağlı değil. Yöneticiler, yeni teknoloji ve programlama dillerini değerlendirirken faydaları ve riskleri düşünmek zorundadır. Yeni programcılar yeni programlama dilini hızlı bir şekilde öğrenebilir mi? Teknolojide şirkette deneyim var mı? Bir risk var mı ve bunun üst yönetimle tartışmak zor olacak mı?

İş bağlamında, işlevsel programlama, çekirdek yazılım bileşenlerine ekleyen sistemlerde, örneğin çok kritik olmayan bileşenlerde kullanılabilir. Örneğin, çekirdek yazılımı zor değiştirecek ancak yeni programlama dilinde yeni parçalar (GUI, izleme yazılımı vb.) Ekleyecek bir banka. (Belki de istisnalar vardır, ama bu benim bankalarla olan deneyimim.)

Ayrıca, resmi doğrulama bir fayda veya şart olduğunda, fonksiyonel programlama çok yararlıdır.


3
"öğrenmesi kolay": Haskell’de ustalaşmayı modern C ++ 'da ustalaşmaktan daha zor bulmuyorum. Bence aşina olmadığımız şeyleri zor kabul etme eğilimindeyiz.
Giorgio,

1

Faydalı bir paradigma olarak FP'ye karşı değilim, ancak programlama dilinde mevcut olan tek paradigmaya karşıyım.

Bir çok problemi çözmede avantajlar sunar. Bununla birlikte, AP C gibi işlemsel dillerde uygulanabilir ve uygulanmıştır.


İlk cümleyle katılıyorum, ikincisine katılmıyorum. Temelde çöp toplamadan FP yapamazsınız.
dsimcha

Bir dilin çalışma zamanı sisteminin "yordamsal" etikete uyması için şeffaf bellek yönetiminden (çöp toplama işleminden) yoksun olması şartı yoktur, bu yüzden ikinci cümlenizi bu şekilde ifade etmeniz ironik. TEMEL böyle bir dildir.
Huperniketes

“Temelde çöp toplamadan FP yapamazsınız.” - Niye ya?
quant_dev

+1 En temel düzeyde fonksiyonel programlama, durumsuz programlamadır. Ben herhangi bir dil yoktur sanmıyorum edemez bir ölçüde bunu. C, C ++, Java, assembly, C #, hatta Basic fonksiyonlarını yazdım. Gereken tek şey, işlevin yan etkileri olmaması veya çağrılar arasında durumu korumasıdır.
Michael K,

Öte yandan, eğer diliniz tamamen safsa, derleyici optimizasyonlarında daha fazla uzmanlığa sahiptir. Ayrıca, kodun test edilmesi ve bunun nedeni de kolaylaşır. Tamamında işlevsel olmak yok hibrit yaklaşımı karşısında bazı avantajlara vermek; Kodunuzun çoğunluğunun zaten vatansız olması durumunda, biraz daha ileri gidebilir ve ek avantajlardan yararlanabilirsiniz.
Tikhon Jelvis

1
  1. (ve en önemlisi) Programcı işgücü bu dillerde veya tarzlarda eğitilmemiştir.
  2. İşlevsel habercilerin birçoğu, işlevsel satmaya çalıştıkları için bir delik veya meyveli kek olarak ortaya çıkıyor. Kimse delik açmayı sevmez ve kimse meyveli kekin arkasına para alamaz. Dikkat et, gerçekten işlevsel şeyleri seviyorum ve içeri çekmek istiyorum, ama işyerimde biliyorum ki, eğitim için para harcamadan geliştirebilecek tek kişi ben olacağım (çok satma) ve hemen hemen tüm iyiliği okuyucunun tartışmalarına atıfta bulunur.

Yüzlerce çekirdeğe sahip olduğumuzda işlevsellik ortaya çıkacak ve kilitlerin ölçeklenmediğinin farkına varacaksınız. Sonra iç içe geçmiş veriler paralel "büyük demir" programları için gidilecek tek yol olacaktır ve bu konuda işlevsel üstünlükler olacaktır.


0

FP akademi'de havalıdır, çünkü performansı görmezden gelirken güzel kısa programlar yazmak iyidir. Gerçek dünyada buna karşı bir komplo yok. Ayrıca, örneğin bazı şeyleri uygulamak (örneğin radix sıralaması) FP'de toplam ağrı gibi görünmektedir. Oh ve oluşturulan kod IMHExperience sloooooooooooooooooooooow.


4
Evet, bu sadece açık bir şekilde doğru değil. Haskell kodu genellikle C ve Java ile aynıdır ve Python ve arkadaşlarından çok daha hızlıdır. Ayrıca, potansiyel olarak daha fazla hız vererek, paralelleştirmek genellikle önemsizdir.
Tikhon Jelvis

0

Bazılarının oldukça dik bir öğrenme eğrisi vardır, uzun zaman alırlar (özellikle OOP'dan geliyorsanız; paradigma değişimini almadan önce birkaç kez başınızı gevşetirsiniz).

Fonksiyonel programlamaya başladığım halde (Java'dan geliyor ve Clojure'a gidiyorum) hala oldukça zor buluyorum. Topluluk, Java kadar açık kod yazmıyor.

Anlaşılırlıkta küçük bir kayıp ve karmaşıklıkta küçük bir artış var gibi görünüyor.


Önceden programlama deneyimi olmayan kişilerin, OOP'nin FP'ye daha yakın bir öğrenme eğrisi olduğunu söyleyeceğini düşünüyorum, çünkü FP Matematik'e daha yakındır. "Topluluk, Java kadar açık kod yazmıyor gibi görünüyor" derken ne demek istediğinizi anlamadım, amacınız nedir?
Jonas

Etkileyici bir dil kaybeden işlevsel dil duymadım. Ama o zaman ben de Java'dan daha az anlamlı bir dil kullanmamıştım, bu yüzden farklı bir "etkileyici" deffinasyonum olabilir.
glenatron

@Jonas - basit bir şey yüzünden: fonksiyonlar, değişkenler, vb. İçin kısayol isimleri ... demek istediğim, neden sadece ne oldukları ya da yapması gereken şeyler için bir şeyler adlandırmıyorsunuz? neden "pmap"?
Belun

1
@Belun: Bunun işlevsel programlama ile ilgisi yok. Belirli bir programlama diline başvurmalısınız. Harita , birçok işlevsel programlama dilinde ortak bir işlevdir ve iyi bir isme sahiptir . pmapbakın bir paralellik çeşidi olabilir.
Jonas

Ben "topluluk yazmıyor gibi görünüyor" dedim. bu benim yaşadıklarım ve izlediğim topluluğa karşılık veriyor. Bundan şüphem olsa da, hepsine uygulamak zorunda değilsin. işlevsel programlama ile ilgili
olmalı

0

İşlevsel programlama dilleri hakkında çok az deneyimim olsa da (bazı Haskell ve Lisp'leri biliyorum) FP paradigmasını çok güçlü ve diğer paradigmalardan daha zarif buluyorum. FP kullanarak ciddi bir proje üzerinde çalışma şansım olsaydı.

FP'nin etkinliği ile ilgili bazı ciddi şüphelerim olan tek alan, endüktif olarak tanımlanamayan karmaşık veri yapılarıyla, örneğin grafiklerle nasıl başa çıkabileceği konusudur. Örneğin, büyük bir grafik üzerinde çalışan, muhtemelen grafiğin içinden geçen ve küçük yerel değişiklikler yapan bir algoritma uygulamak zorunda kalırsam, bir FP yaklaşımının, programın düğümden geçiş yapmasına izin verilen zorunlu bir yaklaşıma uyup uymadığını merak ediyorum. işaretçileri kullanan düğüm.

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.