Neden işlevsel diller? [kapalı]


332

Burada fonksiyonel diller ve diğer şeyler hakkında çok fazla konuşma görüyorum. Neden "geleneksel" bir dilden birini kullanıyorsunuz? Daha iyi ne yapıyorlar? Ne daha kötüsü? İdeal fonksiyonel programlama uygulaması nedir?


John Hughes bunun hakkında bir makale yazdı: İşlevsel Programlama Neden Önemlidir .
Hjulle

Yanıtlar:


214

İşlevsel diller, zorunlu ve nesneye yönelik dillerden farklı bir paradigma kullanır. Dilde temel yapı taşı olarak yan etkisi olmayan işlevleri kullanırlar. Bu, birçok şeyi mümkün kılar ve birçok şeyi daha zor hale getirir (veya çoğu durumda insanların alışkın olduklarından farklıdır).

Fonksiyonel programlamanın en büyük avantajlarından biri, yan etkisiz fonksiyonların yürütülme sırasının önemli olmamasıdır. Örneğin, Erlang'da bu, eşzamanlılığı çok şeffaf bir şekilde sağlamak için kullanılır. İşlevsel dillerdeki işlevler matematiksel işlevlere çok benzediği için bunları işlevsel dillere çevirmek kolaydır. Bazı durumlarda bu, kodu daha okunabilir hale getirebilir.

Geleneksel olarak, fonksiyonel programlamanın en büyük dezavantajlarından biri de yan etkilerin olmamasıydı. IO olmadan faydalı yazılım yazmak çok zordur, ancak IO'nun işlevlerde yan etkisi olmadan uygulanması zordur. Bu yüzden çoğu insan fonksiyonel programlamadan tek bir girişten tek bir çıktı hesaplamaktan daha fazlasını elde edemedi. F # veya Scala gibi modern karma paradigma dillerinde bu daha kolaydır.

Modern dillerin çoğunda fonksiyonel programlama dillerinin unsurları vardır. C # 3.0 çok fonksiyonel programlama özelliklerine sahiptir ve Python'da da fonksiyonel programlama yapabilirsiniz. İşlevsel programlamanın popülaritesinin nedenlerinin çoğunlukla iki nedenden kaynaklandığını düşünüyorum: Eşzamanlılık, normal programlamada gerçek bir sorun haline geliyor çünkü daha fazla çok işlemcili bilgisayar alıyoruz; ve diller daha erişilebilir hale geliyor.


14
Python'da fonksiyonel programlama yapabilirsiniz, ancak gerçekten korkunç. stackoverflow.com/questions/1017621/…
Gordon Gustafson

28
O var olmayan saf fonksiyonel dilde IO kod yazmak zor. Hepsi, zorunlu dillerde olduğu gibi çalışan IO kodunu yazmak için basit bir mekanizma sağlar. Bütün yaptıkları olduğunu zorlamak Eğer arayüz IO performans olarak ilan edilir başka bir kod içine IO kodunu arayamayacağımı. Bir benzetme, Java gibi statik olarak yazılan bir dilin bir yöntemden istediği türü döndürmeyi zorlaştırdığından şikayet eden dinamik bir dil programcısı olurdu, çünkü tür bildiriminin geri döneceğini söylediği her şeyi geri vermek zorunda kaldı.
Ben

9
Haskell, söylediğiniz dezavantaja sahip olmayan saf işlevsel dilin bir örneğidir. Aslında yan etkilerle başa çıkmayı çok daha kolay hale getirir, çünkü yan etkiler kapsüllenir ve programcıya zorunlu dillerden çok daha güçlü bir soyutlama seviyesi sağlar ... Gerçekten, herkes Haskell'i denemeli, gerçekten kavramalı ve fark etmelidir neden bu kadar güçlü?
FtheBuilder

202

"Yakalamak" için işlevsel yaklaşım hakkında herhangi bir soru olduğunu düşünmüyorum, çünkü yaklaşık 40 yıldır kullanılıyor (programlama tarzı olarak). Bir OO programcısı değişmez nesneleri destekleyen temiz kodlar yazdığında, bu kod işlevsel kavramları ödünç alır.

Bununla birlikte, işlevsel bir tarzı zorlayan diller bugünlerde çok sayıda sanal mürekkep alıyor ve bu dillerin gelecekte baskın olup olmayacağı açık bir sorudur. Benim şüphem , Scala veya OCaml gibi melez, çoklu paradigma dillerinin , saf OO dilinin (Smalltalk, Beta, vb.) Anaakım programlamayı etkilediği gibi "saf" işlevsel diller üzerinde baskın olacağı yönündedir . en yaygın kullanılan gösterimler olarak.

Son olarak, FP ile ilgili yorumlarınızın uzun yıllar önce prosedürel programcılardan duyduğum sözlere oldukça paralel olduğunu belirtmeye direnemiyorum:

  • (Efsanevi, IMHO) "ortalama" programcı bunu anlamıyor.
  • Yaygın olarak öğretilmiyor.
  • Onunla yazabileceğiniz herhangi bir program mevcut tekniklerle başka bir şekilde yazılabilir.

Nasıl grafik kullanıcı arayüzleri ve "iş modeli olarak kod", OO'nun daha çok takdir edilmesine yardımcı olan kavramlar gibi, değişmezliğin ve daha basit (büyük) paralelliğin artan kullanımının, daha fazla programcının fonksiyonel yaklaşımın sunduğu faydaları görmesine yardımcı olacağına inanıyorum. . Ancak , son 50 yıl içinde dijital bilgisayar programlama tarihinin tamamını oluşturan öğrendiğimiz kadarıyla , hala öğrenecek çok şeyimiz olduğunu düşünüyorum. Yirmi yıl sonra, programcılar, şu anda kullandığımız araçların ilkel doğasına , şimdi popüler OO ve FP dilleri de dahil olmak üzere şaşkınlıkla bakacaklar .


55
Sadece 20 yıl öncesine bak. Programlamanın çok geliştiği hiçbir şey değil. Daha iyi araçlara, belki yeni bir dile veya 2'ye sahip ama temelde çok fazla şey değişmeyecek. Bu 20 yıldan fazla sürecek. Hepimiz bir zamanlar 2000 yılında uçan arabaları göreceğimizi düşündük. :)
bibac

32
O'Caml ise İrlandalı.
defmeta

7
@alex garip: "Değişmezlik lehine" ve "yan etkilerden kaçın", hem nesne yönelimli hem de zorunlu programlama okullarında uzun süredir iyi bir kural olmuştur. (Peki
beğenmemek

101
@bibac: 20 yıl önce C kodu yazıyorduk ve Clipper veya Turbo Pascal'ın avantajlarını tartışıyorduk. Nesne Yönelimi, akademisyenlerin münhasır alanıydı. Çok az şeyin değiştiğini söylemek düpedüz saçmadır.
Daniel C.Sobral

24
@Daniel: Lütfen Clipper'ın "değerlerini" savunan bu kişilerin bir listesini sağlayın. Avlanmaları ve adalete teslim edilmeleri gerekiyor.
David

125

Benim için ana artı, özellikle şimdi daha fazla MHz'den ve daha fazla çekirdeğe doğru ilerlediğimiz için doğal paralelliğidir.

Bir sonraki programlama paradigması olacağını ve tamamen OO tipi yöntemlerin yerini alacağını düşünmüyorum, ancak kodumun bir kısmını fonksiyonel bir dilde yazmamız gerektiğine veya genel amaçlı dillerimizin daha fonksiyonel yapılar içerecek şekilde büyür.


4
Bunun olduğunu zaten görüyoruz. Ve gelecekte daha fazla olacak. Bu noktada% 100 katılıyorum.
Jason Baker

Zor olan şey, FP'nin paralellik için bu kadar uygun olmasını sağlayan paylaşılan hiçbir şey / yan etki yönü olmamasıdır. Ve bunlar OO çözümleriyle iyi uymayan yönlerdir - etkili melezler yapmak son derece zordur. Belki OO düğümleri arasında FP yapıştırıcı?
James Brady

Etkili bir melez için D programlama dilinin 2.0 şubesine bir göz atın. Bu bir alfa / yapım aşamasında, ama oraya varıyor.
6sim0

2
Bu cevabı ilginç buldum, fonksiyonel bir dil bilmiyorum, neden paralellik için daha uygun oldukları düşünülüyor?
andandandand

26
Paylaşılan veri olmadığından, işlevlerin yan etkisi yoktur. Tek önem verdiğiniz dönüş değeri. (Bu, bir OO / prosedür programcısının başını döndürmesi için oldukça zor bir fikirdir.) Bu nedenle, birinden çıktı başka bir girdi olarak kullanılmadığı sürece birçok işlev bir kerede çağrılabilir.
Tom Smith

79

Hiçbir zaman profesyonel bir dilde profesyonel olarak çalışmasanız bile, fonksiyonel programlamayı anlamak sizi daha iyi bir geliştirici yapar. Kodunuz ve genel olarak programlama hakkında size yeni bir bakış açısı kazandıracaktır.

Diyorum ki öğrenmemek için bir sebep yok.

Bence fonksiyonel ve zorunlu tarzı karıştırmak için iyi bir iş yapan diller en ilginç ve başarılı olma olasılığı en yüksek olanlardır.


İyi bir nokta, ama ben "ne şekilde daha iyi bir geliştirici yapacak" bir açıklama görmek istiyorum
mt3

20
Farklı programlama paradigmaları, sorunlara farklı açılardan yaklaşır ve genellikle "farklı düşünme tarzı" veya zihniyet gerektirir. Ve kendinizi birden çok farklı düşünme biçiminde eğitmek (hangisinin hangi durumda kullanılacağını öğrenmeyi ima etmek ...) asla kötü bir şey değildir.
peSHIr

56

Her zaman bir sonraki büyük şey hakkında şüpheliyim. Bir sonraki Büyük Şey, teknolojinin iyi olup olmadığına bakılmaksızın doğru zamanda doğru yerde olmak, tarihin saf bir kazasıdır. Örnekler: C ++, Tcl / Tk, Perl. Tüm kusurlu teknolojiler, hepsi çılgınca başarılı çünkü günün problemlerini çözmek için ya da yerleşik standartlarla neredeyse aynı olduklarını algıladılar. Fonksiyonel programlama gerçekten harika olabilir, ancak bu benimseneceği anlamına gelmez.

Ama olabilir insanlar neden size heyecanlı birçok, birçok programcı "dönüşüm deneyimi" bir tür oldu onlar üretirken fonksiyonel bir dil kullanarak üretken (üretken olarak ya da belki on kat) olarak iki kez yapar keşfetmek burada: fonksiyonel programlama hakkında değiştirmeye daha dayanıklı ve daha az hata içeren kod. Bu insanlar işlevsel programlamayı gizli bir silah olarak düşünürler; bu zihniyetin iyi bir örneği Paul Graham'ın Ortalamaları Atıyor . Oh, ve onun uygulaması? E-ticaret web uygulamaları.

2006 yılının başından bu yana, işlevsel programlama ve paralellik konusunda da bazı sıkıntılar yaşandı. Simon Peyton Jones gibi insanlar en azından 1984'ten beri paralellikten endişe duyduklarından, fonksiyonel diller çok çekirdekli sorunu çözene kadar nefesimi tutmuyorum. Ancak şu andaki ek vızıltılardan bazılarını açıklıyor.

Genel olarak, Amerikan üniversiteleri fonksiyonel programlamayı öğretmek için kötü bir iş çıkarmaktadır. Scheme kullanarak intro programlamayı öğretmek için güçlü bir destek çekirdeği var ve Haskell de bazı desteklerden hoşlanıyor, ancak fonksiyonel programcı için gelişmiş teknik öğretmenin çok az yolu var. Harvard'da böyle bir ders verdim ve bunu bu bahar Tufts'ta tekrar yapacağım. Benjamin Pierce Penn'de böyle bir ders verdi. Paul Hudak'ın Yale'de bir şey yapıp yapmadığını bilmiyorum. Avrupa üniversiteleri çok daha iyi bir iş çıkarıyor; örneğin, Danimarka, Hollanda, İsveç ve Birleşik Krallık'ta önemli yerlerde fonksiyonel programlama vurgulanmaktadır. Avustralasya'da olup bitenler hakkında daha az fikrim var.


İngiltere üniversitelerini bilmiyorum. Buradaki birçok üniversitenin çok az programlama dili öğrettiğini (Java, C, belki de Perl ise). Buradaki sorun, en iyi (az sayıda) üniversitenin en iyi CS programlarına sahip olması nedeniyle kalite farkıdır.
Mike B

Verdiğiniz örneklerin kusurlu, belki de niş veya belirli alanlar için uygun olduğunu kabul etmiyorum, ancak genel bir öğrenme eğrisi olmadan evrensel olarak alınacak kadar genel amaç. muhtemelen bu kadar başarılı olmasının en büyük nedeni.
gbjbaanb

Forth ve Lisp'i Birleşik Krallık'ta (Pascal, C, Modula2 ve Cobol'un yanı sıra) uni'de yaptım ama bu 20 yıl önceydi ..
kpollock

29
Bana üniversitede Java / C ++ öğretildi (Avustralya'da), ancak birkaç iş arkadaşım Haskell'de birkaç ünite yaptıkları farklı üniversitelere gitti. Hem programlamaya giriş hem de son yıl birimlerinden biri için kullanıldı. Bir meslektaşımın ilk kez döküm yapmaya başladıktan sonra bir Java öğretim görevlisine söylediklerini duyduğumda güldüm (bu noktada sadece Haskell'i biliyordu) - "Ne ?! t Ne tür olduğunu biliyor musunuz ?! "
Jacob Stanley

1
Takımdaki tüm Avrupalılar ile C # 'a ne olduğuna bakın :)
Benjol

32

Burada odada fil söz kimse görmüyorum, bu yüzden bana kalmış :)

JavaScript işlevsel bir dildir. JS ile gittikçe daha fazla insan, özellikle jQuery, Dojo ve diğer çerçevelerin daha ince noktalarından yararlanarak, daha gelişmiş şeyler yaptıkça, FP web geliştiricisinin arka kapısı tarafından tanıtılacak.

Kapaklarla birlikte FP, JS kodunu gerçekten hafif ama yine de okunabilir hale getirir.

Şerefe, PS


2
Gerçekten işlevsel programlamayı kazmaya başladım. Hiçbir şey Prototype.js listesinden daha iyi değildir.Her (işlev (öğe) {}) veya jQuery'nin tüm çalışma yöntemi.
Cory R. King

20
Javascript, kişinin işlevsel bir şekilde programlamasına izin verir. Bununla birlikte, birinin farklı şekillerde programlamasına izin veren çapraz bir paradigma dilidir (tercih ederim, ancak bu ilgili değil) ... OO, fonksiyonel, prosedür vb.
RHSeeger


JQuery nesnesi yöntemleri sadece liste monadındaki işlemlerdir. Bir kabı (veya diziyi) giriş olarak temsil eden bir nesneyi almak ve bir nesne kabını çıktı olarak döndürmek, fmap'in pratik olarak yeniden icat edilmesinin güzel bir örneğidir.
Jared Updike

25

Çoğu uygulama normal OO yollarıyla çözülebilecek kadar basittir

  1. OO yolları her zaman "normal" olmamıştır. Bu on yılın standardı son on yılın marjinalleşmiş konseptiydi.

  2. Fonksiyonel programlama matematiktir. Lisp'de Paul Graham ( Lisp'in yerine fonksiyonel programlama):

Bu yüzden bu 1950'lerin dilinin neden eskimiş olmadığına dair kısa açıklama, teknoloji değil, matematik ve matematik bayatlamıyor. Lisp'yi karşılaştırmak için doğru olan şey 1950'lerin donanımı değil, 1960'da keşfedilen ve hala en hızlı genel amaçlı sıralama olan Quicksort algoritmasıdır.


25

Eminim kullandığınızda fonksiyonel programlama yaptığınızı bilmiyordunuz:

  • Excel formülleri
  • Kuvars Besteci
  • JavaScript
  • Logo (Kaplumbağa grafikleri)
  • LINQ
  • SQL
  • Underscore.js (veya Lodash), D3

10
Javascript işlevsel programlama olarak nasıl değerlendirilir?
Pacerier

8
Birinci sınıf fonksiyonlar, yüksek dereceli fonksiyonlar, kapaklar, anonim fonksiyonlar, kısmi uygulama, köri ve kompozisyona sahiptir.
daniel1426

2
Haha. Bir kez iç içe geçmiş fonksiyonları ile ekran daha geniş bir yük geri ödeme Excel formülü yazdı. O zamanlar işlevsel olarak programlama yaptığımı biliyordum, ama henüz terimi bilmiyordum.
ProfK

7
Lütfen bu listeye C ekleyin
Mandeep Janjua

2
@MandeepJanjua: Ha? Nasıl olur? Ya da o zaman neden herhangi bir dil olmasın?
Sz.

18

Ortalama bir kurumsal programcı, örneğin birlikte çalıştığım insanların çoğu bunu anlamayacak ve çalışma ortamlarının çoğu programlamanıza izin vermeyecek

Bu sadece bir zaman meselesi. Ortalama bir kurumsal programcınız mevcut Big Thing ne olursa olsun öğrenir. 15 yıl önce, OOP'yi anlamadılar. EĞER FP senin "ortalama kurumsal programcılar" takip edecek, yakalar.

Gerçekten üniversitelerde öğretilmiyor (ya da günümüzde mi?)

Çok değişir. Üniversitemde, SML öğrencilerin tanıtıldığı ilk dildir. MIT'in LISP'yi birinci yıl dersi olarak verdiğine inanıyorum. Bu iki örnek elbette temsili olmayabilir, ancak inanıyorum ki çoğu üniversite, müfredatın zorunlu bir parçası olmasalar bile, FP'de bazı isteğe bağlı dersler sunmaktadır.

Çoğu uygulama normal OO yollarıyla çözülebilecek kadar basittir

Bu gerçekten de "yeterince basit" bir mesele değil. FP'de bir çözüm daha basit (veya daha okunabilir, sağlam, zarif, performanslı) olur mu? Birçok şey "Java'da çözülebilecek kadar basit", ancak yine de godawful miktarda kod gerektirir.

Her halükarda, FP taraftarlarının bunun onlarca yıldır Sonraki Büyük Şey olduğunu iddia ettiğini unutmayın. Belki de haklılar, ancak 5, 10 veya 15 yıl önce aynı iddiayı yaptıkları zaman olmadığını unutmayın.

Bununla birlikte, kesinlikle onların lehine sayılan bir şey, son zamanlarda, C # 'ın, farkına bile varmadan , bir nesil programcıyı FP programcılarına dönüştürdüğü ölçüde, FP'ye keskin bir dönüş yaptığıdır . Bu sadece FP "devriminin" önünü açabilir. Olabilir. ;)


MİT kullanılan ders kendi intro CS için Scheme öğretmek, ama şimdi Python kullanır.
mipadi

1
"15 yıl önce, OOP anlamıyorlardı" - Sorun şu ki, 15 yıl önce FP de anlamadılar. Ve bugün hala bilmiyorlar.
Jason Baker

15

İnsan, diğer sanatlardaki değeri göremezse, seçtiği sanatın mükemmelliğini ve kusurlarını anlayamaz. Kurallara uymak sadece teknikte bir noktaya kadar gelişmeye izin verir ve daha sonra öğrenci ve sanatçı daha fazla öğrenmek ve daha fazla araştırmak zorundadır. Stratejinin yanı sıra diğer sanatları da incelemek mantıklı.

Kim başkalarının faaliyetlerini izleyerek kendileri hakkında daha fazla şey öğrenmedi? Kılıcı gitar çalmayı öğrenmek. İlk çalışma ticaretini öğrenmek. Sadece kılıcı incelemek seni dar görüşlü yapar ve dışa doğru büyümene izin vermez.

- Miyamoto Musashi, "Beş Yüzüklü Bir Kitap"


12

İşlevsel bir dilde anahtar özelliklerden biri birinci sınıf işlevler kavramıdır. Buradaki fikir, işlevleri parametre olarak diğer işlevlere geçirip değer olarak verebilmenizdir.

Fonksiyonel programlama, durumu değiştirmeyen kod yazmayı içerir. Bunu yapmanın başlıca nedeni, bir işleve art arda yapılan çağrıların aynı sonucu vermesidir. Birinci sınıf işlevleri destekleyen herhangi bir dilde işlevsel kod yazabilirsiniz, ancak Haskell gibi durumu değiştirmenize izin vermeyen bazı diller vardır. Aslında, herhangi bir yan etki (metin yazdırmak gibi) yapmamanız gerekir - ki bu tamamen işe yaramaz gibi görünebilir.

Haskell bunun yerine IO: monad'lara farklı bir yaklaşım uyguluyor. Bunlar, tercümanınızın üst seviyesi tarafından yürütülmesini istediğiniz IO işlemini içeren nesnelerdir. Başka herhangi bir seviyede bunlar sistemdeki nesnelerdir.

Fonksiyonel programlama ne gibi avantajlar sağlar? Fonksiyonel programlama, her bileşen tamamen izole edildiğinden hatalar için daha az potansiyel ile kodlamaya izin verir. Ayrıca, özyineleme ve birinci sınıf işlevlerin kullanılması, genellikle kodun yapısını yansıtan basit doğruluk kanıtlarına izin verir.


12

Çoğu gerçekçi insanın işlevsel programlamanın yakalayacağını düşündüğünü sanmıyorum (OO gibi ana paradigma olur). Sonuçta, çoğu iş problemi oldukça matematik problemleri değil, verileri hareket ettirmek ve çeşitli şekillerde görüntülemek için kıllı zorunlu kurallardır, bu da saf fonksiyonel programlama paradigması için iyi bir uyum olmadığı anlamına gelir (monad'ın öğrenme eğrisi OO'yu aşar).

OTOH, fonksiyonel programlamayı programlamayı eğlenceli kılan şeydir. Evrenin temel matematiğinin özlü ifadelerinin doğal, zamansız güzelliğini takdir etmenizi sağlar. İnsanlar fonksiyonel programlamayı öğrenmenin sizi daha iyi bir programcı yapacağını söylüyor. Bu elbette son derece özneldir. Şahsen bunun da tamamen doğru olduğunu düşünmüyorum.

Seni daha iyi bir canlı yapar.


6
OO'nun FP'den doğal olarak daha kolay olduğunu düşünmüyorum. Gerçekten arka planınıza bağlıdır (ben bir matematikçiyim, tahmin et ne çok daha kolay buldum? :) Kahretsin OO insanlarına ve deli kurallarına.
temp2290

14
Monadları anlamak zor değil. O boğa güreğine alışma.
Rayne

-1 OOP FP'den daha zordur
sadece birileri

-1 FP sadece güzel matematik problemleri için uygun olsaydı, OCaml veya Haskell kullanarak optimizasyon derleyicileri yazmazdık.
gracchus

8

Yoğun olmalıyım, ama hala anlamıyorum. Kaynak koduna bakabileceğiniz ve böyle bir yaklaşımı kullanmanın nasıl ve neden daha iyi olduğunu görebileceğiniz F # gibi fonksiyonel bir dilde yazılmış küçük uygulamaların gerçek örnekleri var mı?


İyi açıklama +1. @Mendelt: "daha erişilebilir" mi? Yani kodu izlerken baş ağrısının daha hızlı olduğunu mu söylüyorsun?
Patrick Honorez

2
Şu F # kütüphanesine bakın: quanttec.com/fparsec/tutorial.html . Ben aynı talimatlar için derlenmiş olsa bile, örnek kod F # kodunun yarısı kadar zarif ve okunabilir ayrıştırıcılar ile C # görmek istiyorum. FParsec'i F # 'dan C #' a taşımayı deneyin ve kodun nasıl şiştiğini görün.
Jared Updike

8

İşlevsel diller hakkında söylediğiniz her şeyin, çoğu insanın yaklaşık 20 yıl önce nesneye yönelik diller hakkında söylediklerini belirtmek isterim. O zamanlar OO hakkında duymak çok yaygındı:

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

Değişim bir yerden gelmek zorunda. Anlamlı ve önemli bir değişiklik, önceki teknolojiler konusunda eğitim almış insanların değişimin gerekli olmadığı görüşünü alıp almadığına bakılmaksızın kendisini gerçekleştirecektir. O zamana karşı olan tüm insanlara rağmen OO'daki değişimin iyi olduğunu düşünüyor musunuz?


2
* Ortalama kurumsal programcı, örneğin en beraber çalıştığım insanların, bunu anlamak olmayacak ve en çok iş ortamlarında Eğer içinde programlamak izin vermez - İşte yine onlar (ders arasında :) Ben çalıştığım birçok yerde OOP gerçek say OOP yapıyorlar, ama değiller)
tolanj

7

Microsoft ittiği için F # yakalayabilir.

Pro:

  • F #, Visual Studio'nun sonraki sürümünün bir parçası olacak
  • Microsoft bir süredir topluluk oluşturuyor - Evangelistler, kitaplar, yüksek profilli müşterilerle çalışan danışmanlar, MS konferanslarında önemli ölçüde pozlama.
  • F # birinci sınıf. Net dil ve gerçekten büyük bir temel ile gelen ilk fonksiyonel dil (Lisp, Haskell, Erlang, Scala, OCaml'ın çok fazla kütüphanesi olmadığını söylemiyorum, .Net kadar eksiksiz değiller. dır-dir)
  • Paralellik için güçlü destek

Contra:

  • F #, C # ve .Net ile iyi olsanız bile başlamak çok zordur - en azından benim için :(
  • iyi F # geliştiricileri bulmak muhtemelen zor olacak

Bu yüzden F # 'a önemli olması için 50:50 şans veriyorum. Diğer fonksiyonel diller yakın gelecekte bunu yapmayacak.


6
Scala'nın JRE ile oldukça derin bir temel olduğunu iddia ediyorum.
cdmckay

2
Kütüphanelerle ilgili olarak, bu gerçekten ne yaptığınıza bağlıdır. F # finans sektörünü hedeflemektedir ve bilimsel hesaplama için de geçerlidir ancak OCaml aslında bu tür uygulamalar için .NET'ten çok daha iyi kütüphanelere sahiptir. Örneğin, OCaml'den F #'a geldiğimde iyi bir FFT bulamadım ve C # ve sonra F # 'da kendi yazımı (ve satmayı) sona erdirdim.
Jon Harrop

1
LINQ C # ve VB.Net ile fonksiyonel kavramları kullanmak için iyi bir köprüdür ... Ve F # ile karşılaştırıldığında okumak için çok daha az acı verici buluyorum
Matthew Whited

5

Sanırım bir sebep, bazı insanların bir dilin kabul edilip edilmeyeceğinin en önemli kısmının dilin ne kadar iyi olduğunu düşünmesidir . Ne yazık ki, işler nadiren çok basittir. Örneğin, ben o halde Python'un kabul arkasında büyük faktör (dil kendisi olmadığını iddia ediyorum olduğu oldukça önemli). Python'un bu kadar popüler olmasının en büyük nedeni, devasa standart kütüphanesi ve daha büyük 3. parti kütüphanelerinden oluşan topluluktur.

Clojure veya F # gibi diller, JVM / CLR üzerine kuruldukları düşünüldüğünde bu kuralın istisnası olabilir. Sonuç olarak, onlar için bir cevabım yok.


+1 ama pazarlamanın gücünü ve şirketinizin eski kod dağının yeni havalı trendlerle dil değiştirmeyeceğini unutmayın.
temp2290

Ve şunu belirtmeyi unuttunuz: Google, python'u popülerleştiriyor.
Hao Wooi Lim

4

Uygulamaların çoğu [en sevdiğiniz dili, paradigmayı vb. Buraya yazın] içinde çözülebilir.

Bu doğru olsa da, farklı sorunları çözmek için farklı araçlar kullanılabilir. Fonksiyonel, doğru kullanıldığında işlerimizi daha etkili bir şekilde yapmamıza izin veren başka bir yüksek (daha yüksek?) Seviye soyutlamaya izin verir.


4

Bana öyle geliyor ki Lisp veya Scheme'yi bir lisans olarak hiç öğrenmemiş olan insanlar şimdi keşfediyorlar. Bu alandaki birçok şeyde olduğu gibi, yüksek beklentiler aldatıcı ve yaratma eğilimi var ...

Geçecek.

Fonksiyonel programlama harikadır. Ancak, dünyayı ele geçirmeyecektir. C, C ++, Java, C #, vb.

Bunun ne olacağını daha çok dil arası yetenek olarak görüyorum - örneğin şeyleri işlevsel bir dilde uygulamak ve daha sonra diğer dillerdeki şeylere erişim vermek.


1
C # artık birinci sınıf sözlüksel kapanışlara sahip olduğu için işlevsel bir programlama dilidir (Lisp kadar). Gerçekten de, WPF ve TPL'de zaten kullanılıyorlar. Fonksiyonel programlama zaten burada.
Jon Harrop


3

Bir süredir işler işlevsel bir yönde ilerliyor. Son birkaç yılın iki havalı yeni çocuğu olan Ruby ve Python, her ikisi de işlevsel dillere önlerinden gelenlerden radikal olarak daha yakınlar - o kadar ki bazı Lispers birini veya diğerini "yeterince yakın" olarak desteklemeye başladı.

Ve büyük ölçüde paralel donanım herkes üzerinde - ve değişikliklerle başa çıkmak için en iyi yerde fonksiyonel diller - evrim baskısı yaratarak - Haskell veya F # 'nin bir sonraki büyük şey olacağını düşünmek kadar büyük bir sıçrama değil.


3

Son zamanlarda programlama dillerinin gelişimini takip ediyor musunuz? Tüm anaakım programlama dillerinin her yeni sürümü, işlevsel programlamadan giderek daha fazla özellik ödünç alıyor.

  • Kapanışlar, anonim işlevler, geçen ve dönen işlevler, yalnızca Lisp ve ML bilgisayar korsanları tarafından bilinen egzotik özelliklerdi. Ancak yavaş yavaş, C #, Delphi, Python, Perl, Javascript, kapanışlar için destek ekledi. Yaklaşan herhangi bir dilin kapanmadan ciddiye alınması mümkün değildir.

  • Özellikle Python, C # ve Ruby gibi birçok dilde liste anlama ve liste oluşturucular için yerel destek bulunur.

  • ML 1973'te jenerik programlamaya öncülük etti, ancak jenerik ("parametrik polimorfizm") desteği sadece son 5 yılda bir endüstri standardı haline geldi. Doğru hatırlıyorsam, Fortran 2003'te jenerikleri destekledi, ardından 2005'te Java 2004, C # 2008, Delphi'yi 2008'de destekledi. .)

Bu özellikleri programcılara çekici yapan nedir? Açıkça görülmelidir: programcıların daha kısa kod yazmasına yardımcı olur . Gelecekte tüm diller, rekabetçi kalmak istiyorlarsa en azından kapanmaları destekleyeceklerdir. Bu bakımdan fonksiyonel programlama zaten ana akımdadır.

Çoğu uygulama normal OO yollarıyla çözülebilecek kadar basittir

Kim demiş fonksiyonel programlamayı basit şeyler için de kullanamaz? Her işlevsel programın bir derleyici, teorem kanıtlayıcı veya büyük ölçüde paralel telekomünikasyon anahtarı olması gerekmez. Daha karmaşık projelerime ek olarak geçici olarak özel komut dosyaları için F # kullanıyorum.




2

İlk noktaya katılıyorum, ama zaman değişiyor. Şirketler geç evlat edinenler olsalar bile, sahip olmanın bir avantajı olduğunu görürlerse cevap vereceklerdir. Hayat dinamiktir.

90'lı yılların sonunda Stanford'da Haskell ve ML'yi öğretiyorlardı. Eminim Carnegie Mellon, MIT, Stanford ve diğer iyi okullar bunu öğrencilere sunuyor.

"Web'de ilişkisel veritabanlarını gösterme" uygulamalarının çoğunun bu bağlamda uzun süre devam edeceğini kabul ediyorum. Java EE, .NET, RoR ve PHP bu soruna oldukça iyi çözümler geliştirmiştir.

Önemli bir şeye çarptınız: İşlevsel programlamayı artıracak başka yollarla kolayca çözülemeyen sorun olabilir. Bu ne olurdu?

Devasa çok çekirdekli donanım ve bulut bilişim bunları beraberinde getirecek mi?


2

Çünkü FP'nin üretkenlik, güvenilirlik ve sürdürülebilirlik açısından önemli faydaları vardır. Çok çekirdekli, nihayet büyük şirketlerin eski büyük kodlara rağmen geçiş yapmasını sağlayan bir katil uygulama olabilir.Ayrıca, C # gibi büyük ticari diller bile çok çekirdekli endişelerin bir sonucu olarak farklı bir işlevsel lezzet alıyor - sadece yan etkiler eşzamanlılık ve paralellik ile iyi uyuşma.

"Normal" programcıların bunu anlamadığını kabul etmiyorum. Eninde sonunda OOP'u anladıkları gibi (daha gizemli ve tuhaf, daha fazla değilse).

Ayrıca, çoğu üniversite FP öğretir, hatta çoğu ilk programlama kursu olarak öğretir.


Maalesef FP, OOP'nin yaklaşık 3 katı kadardı. Bu daha fazla zamana ihtiyaç duyma meselesi değil. FP'nin ana akım haline getirilmesi daha fazla şey alacaktır.
Jason Baker

Yazımın "daha fazla bir şeyin" çok çekirdekli olabileceğini açıkladığım kısmını nasıl özleyebildin? Ve "etrafta olmak" bir şey gerçekten alakalı değil. İnsanlar OOP'u anladılar çünkü o zamanlar somut faydalar sundular, FP sadece son zamanlarda pratik oldu.
Sebastian

2

Vay canına - bu ilginç bir tartışma. Bu konuda kendi düşüncelerim:

FP bazı görevleri nispeten basit hale getirir (FP olmayan dillere kıyasla). Hiçbiri FP dilleri şimdiden FP'den fikir almaya başlıyor, bu yüzden bu eğilimin devam edeceğinden şüpheleniyorum ve insanların FP'ye sıçramasını kolaylaştırmak için daha fazla birleştirme göreceğiz.


2

Yakalayıp yakalamayacağını bilmiyorum, ama araştırmalarımdan, fonksiyonel bir dil neredeyse kesinlikle öğrenmeye değer ve sizi daha iyi bir programcı yapacak. Sadece referans şeffaflığı anlamak birçok tasarım kararını çok daha kolay hale getirir - ve sonuçta ortaya çıkan programların akıl yürütmesi çok daha kolaydır. Temel olarak, bir sorunla karşılaşırsanız, yüzlerce sınıf / yöntem / işlevden herhangi birinin neden olabileceği, tutarsız bir durumdaki bir sorundan ziyade, tek bir işlevin çıktısı ile ilgili bir sorun olma eğilimindedir. yan etkileri olan ölçülü bir dilde.

FP'nin vatansız doğası, web'in vatansız doğasına daha doğal bir şekilde eşleşir ve bu nedenle fonksiyonel diller, kendilerini daha zarif, RESTFUL webapps'lere daha kolay borçlandırır. Uygulama durumunu korumak için VIEWSTATE ve SESSION anahtarları gibi korkunç çirkin HACK'lere başvurması gereken ve JAVA ve .NET çerçevelerinin aksine, durum gibi zorunlu bir dilin web gibi temelde vatansız bir işlevsel platformda (bazen oldukça sızdıran) soyutlamasını korumak.

Ayrıca, uygulamanız ne kadar vatansız olursa, paralel işleme için o kadar kolay borç verebilir. Web siteniz popüler hale gelirse, web için çok önemlidir. Daha iyi performans elde etmek için bir siteye daha fazla donanım eklemek her zaman kolay değildir.


2

Benim görüşüme göre, Microsoft bunu ana akımın içine daha da itti. Benim için bu, bizim için yapabileceklerinden dolayı cazip, çünkü yeni bir meydan okuma ve geleceğe yönelik iş fırsatları nedeniyle.

Bir kez hakim olduktan sonra, programcılar olarak bizi daha üretken hale getirmemize yardımcı olacak başka bir araç olacaktır.


2

Tartışmada kaçırılan bir nokta, en iyi tip sistemlerin çağdaş FP dillerinde bulunmasıdır. Dahası, derleyiciler tüm (veya en azından çoğu) türleri otomatik olarak çıkarabilir.

Java programlanırken yazım adlarının yarısını harcamak ilginçtir, ancak Java açık bir şekilde güvenli değildir. Bir Haskell programında asla tip yazamazsınız (derleyici tarafından kontrol edilen bir çeşit doküman hariç) ve kod% 100 tip güvenlidir.


1

Diğer cevaplara ek olarak, çözümü saf fonksiyonel terimlerle ifade etmek, problemi daha iyi anlamaya zorlar. Tersine, işlevsel bir tarzda düşünmek daha iyi * problem çözme becerileri geliştirecektir.

* Ya işlevsel paradigma daha iyi olduğu ya da ek bir saldırı açısı sağlayacağı için.

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.