İşlevsel Programlama için neden mevcut coşku? [kapalı]


50

Son zamanlarda Scala, Clojure ve F # ile ilgili olarak fonksiyonel programlama dilleri konusunda çok fazla coşku duydum. Yakın zamanda FP paradigmasını öğrenmek için Haskell'i çalışmaya başladım.

Onu seviyorum, gerçekten eğlenceli ve matematik geçmişime uyuyor.

Ama bu gerçekten önemli mi? Açıkçası, bu pek yeni bir fikir değil.

İşte sorularım:

  1. Son dönemlerde yapılan FP merakına neler katkıda bulundu? OO ile sadece can sıkıntısı mı var, yoksa FP'yi öncekinden daha çok ihtiyaç duyulan bir şey mi değiştirdi?
  2. Bu bir FP geleceğinin göstergesi midir? Yoksa bu nesne yönelimli veritabanları gibi bir soluk mudur?

Başka bir deyişle, bunun nereden geldiğini ve nereye gidebileceğini anlamama yardımcı olabilir misiniz?



13
Kopya değil - bu yeni bir fikir olmadığı için insanların neden birdenbire telaş yarattığını soruyor (bu soru nesnel farklılıklar için daha fazla soru sorurken).
Peter Boughton

2
Son zamanlarda insanlar FP'ye yaygara mı atıyor? Bana göre haberler, bunun her zaman bir grubun FP'nin zorunlu programlama dünyasını nasıl ele geçireceğine dair bir karışıklık yarattığını düşündüm.
Chris

1
Sanırım daha önce StackOverflow'ta bu soruyu cevapladım .
Ken Bloom

1
Evet - FP zaten eskiydi 1989'da Scheme'yi Columbia'da bir lisans öğrencisi olarak kullanırken, sanırım parlak olan yeni bir şey.
Tim

Yanıtlar:


33

FP’de ilgilenilen “patlama” ile sonuçlanan en büyük yeniliklerden biri monadlar.

1992 yılının Ocak ayında, Philip Wadler İşlevsel Programlamanın Özü adlı bir yazı yazdı ve monoları işlevsel programlamaya IO ile başa çıkmanın bir yolu olarak getirdi.

Saf, tembel, fonksiyonel programlama dilleri ile ilgili en büyük sorun, IO ile başa çıkmada yardımcı oldu. Programlamada "Garip Takım" üyelerinden biri, çünkü "tembellik ve yan etkiler, pratik bir bakış açısıyla uyumlu değil. Tembel bir dil kullanmak istiyorsanız, tamamen işlevsel bir dil olmak zorunda; yan etkileri kullanmak istiyorsan, katı bir dil kullansan iyi edersin. " Referans

Monad'lardan önceki IO ile ilgili sorun, saflığın sürdürülmesinin hiçbir şey için gerçekten yararlı olmayan programlar için mümkün olmamasıydı. IO ile kullanıcı veya ortamdan girdi ve çıktı almak da dahil olmak üzere değişen durumlarla ilgilenen her şeyi kastediyoruz. Saf işlevsel programlamada, tembellik ve saflığı sağlamak için her şey değişkendir (yan etkilerden arınmış).

Monad'lar IO problemini nasıl çözer? Peki, monadları çok fazla tartışmadan, temel olarak "Dünya" yı (çalışma zamanı ortamı) monadın girişi olarak alırlar ve çıktı olarak yeni bir "Dünya" oluştururlar ve sonuç: tür IO a = Dünya -> (a, Dünya).

FP bu nedenle ana akıma giderek daha fazla girdi, çünkü en büyük sorun olan IO (ve diğerleri) çözüldü. Bildiğiniz gibi, mevcut OO dillerine entegrasyon da oluyor. LINQ, örneğin içinden ve içinden monadlardır.

Daha fazla bilgi için, monadları ve cevabımda belirtilen makaleleri okumanızı tavsiye ederim.


Son derece bilgilendirici, teşekkürler. Bu cevabı kabul ediyorum, doğru ve diğerleri yanlış olduğu için (birkaç kişiyi yenmişimdir) değil de sonuçtaki görünürlüğü hak ettiğini düşünüyorum.
Eric Wilson

Daha uygun bir örnek type IO a = UI -> (a, UI)olsa harika bir cevap olurdu .
ChaosPandion

@Richard: "type IO a = Dünya -> (a, Dünya)" gerçek olamayacak kadar iyi geliyor (asla monad alamayacağımı sanıyordum). Sanırım LINQ'i monalara benzetiyorsunuz çünkü bir lambda'yı bir LINQ operatörüne geçirdiğinizde, lambda tüm ortamını "görüyor", doğru mu?
Stefan Monov

@Stefan: Lambda'nın çevreyi gördüğünü söylemek doğru gözüküyor, ancak bunun hakkında% 100 net değilim, bu yüzden kendimi daha fazla öğrenene kadar cevap vermek için tereddüt ediyorum. Ancak,% 100 kesin bir şekilde söyleyebilirim ki, LINQ monadlar. Çünkü yaratıcılar bunu birçok kez söyledi. SelectMany, Haskell'deki Bağlama ile tam olarak eşdeğerdir. Eğer "Monad'ların Harikaları" okumadıysanız ( blogs.msdn.com/b/wesdyer/archive/2008/01/11/… ) Şunu şiddetle tavsiye ederim ... LINQ'un gerçekten nasıl monadlar olduğunu ortaya çıkaracak. Şerefe.
Richard Anthony Hein,

1
@Job, Yukarıdaki yoruma atıfta bulunulan blogs.msdn.com/b/wesdyer/archive/2008/01/11/… adresine bakın .
Richard Anthony Hein,

30

C, Java, C #, assembler vb. Gibi geleneksel dilleri programlarken ortaya çıkan en büyük sorunlardan biri, belirli bir görevi başarmak için atmanız gereken garip adımlar dizisine sahip olmanızdır; çünkü önce tüm bağımlılıkları hazırlamanız gerekir. Onların bağımlılıkları daha önce

Bir örnek: A yapmak için, B ve C’ye sahip olmanız gerekir ve B, D ve E’ye bağlı olarak şöyle sonuçlanır:

  • D
  • E
  • C
  • B
  • bir

Çünkü kullanmadan önce malzemeleri hazırlamanız gerekir.

İşlevsel diller, özellikle de tembel dilleri, bunu ters çevirin. A'nın B ve C'ye ihtiyacı olduğunu söylemesine izin verin ve dilin çalışma zamanının A'yı değerlendirmek için gerektiğinde değerlendirilen B ve C'yi (sırayla D ve E gerektirir) ne zaman alacağını çözmesine izin verin, çok küçük ve özlü Küçük ve özlü programlarla sonuçlanan yapı taşları. Tembel diller, yalnızca gerçekten kullanılan öğeler hesaplandığından ve tüm veri yapısını kullanmadan önce bellekte saklamak zorunda kalmadan, sonsuz listelerin kullanılmasına da izin verir.

Gerçekten güzel bir hile, bu otomatik "oh, bir B ve bir C'ye ihtiyacım var" mekanizmasının ölçeklenebilir olmasıdır, çünkü - sıralı programda olduğu gibi - bu değerlendirmenin nerede ve ne zaman olabileceği ile ilgili herhangi bir kısıtlama yoktur. aynı zamanda ve hatta farklı işlemcilerde veya bilgisayarlarda.

Bu fonksiyonel diller ilginç nedeni de budur - çünkü elle yapmak zorunda programcı aksine mekanizma çalıştırma sistemi tarafından üstlenilir 'ne zaman ne yapacağını'. Bu, otomatik çöp toplamanın Java'dan C'ye kadar olduğu kadar önemli bir fark ve Java'da sağlam, ölçeklenebilir çoklu iş parçacıklı bir yazılım yazmanın daha kolay olmasının en önemli nedenlerinden biri, C yazmaktan daha kolay. İşlevsel dillerde ölçeklendirilebilir çoklu iş parçacıklı yazılım ...


3
Bu elbette 1950'de doğruydu.
Eric Wilson

1
@FarmBoy, gerçekten değil, ama bugün.

5
Bunun Bağımlılık Enjeksiyonundan farkı nedir?
Bill K,

2
@Bill K, mükemmel gözlem - Bu bağlantıyı kendim yapmamıştım. Fark, enjekte edilecek nesnelerin - en azından Java'da - hevesle değerlendirilip tembel olarak değerlendirilmemesidir. Sonsuz bir liste enjekte edemezsiniz.

1
@ Thorbjørn Ravn Andersen Sonsuz bir listenin neden faydalı olacağını anladığımdan emin değilim, aslında (sonsuz liste) tür işlemlerin toplamını yapabilir misiniz? Çok olası görünmüyor. Aksi halde, Java'nın yineleyicileri kullanma şekli gibi ses çıkarır, yineleyiciyi yalnızca istediğiniz zaman nesneleri başlatır, yalnızca sonsuz değil, asla bitmeyen bir şekilde kodlarsınız (BÜYÜK bir fark vardır, ha? )
Bill K

21

80'lerin sonunda / 90'ların başında bilgisayarlar Smalltalk tarzı OOP için yeterince güçlü hale geldi. Günümüzde bilgisayarlar FP için yeterince güçlü. FP daha yüksek seviyede programlama yapıyor ve bu nedenle sık sık - programlamayı daha keyifli iken - en verimli yol değil, belli bir sorunu çözüyor. Fakat bilgisayarlar o kadar hızlı ki umursamıyorsunuz.

Durum değiştiren kodu izole etmek zorunda kaldığınız için çok çekirdekli prorgamming tamamen işlevsel programlama dilleriyle daha kolay olabilir.

Ayrıca programlama dili sınırları bugün bulanık. Başka bir tane kullanmak istiyorsanız bir paradigmadan vazgeçmeniz gerekmez. FP'yi en popüler dillerde yapabilirsiniz, böylece giriş engeli düşük olur.


6
Bir cevap ekleyecektim, ama son cümlenin içindeki noktayı vurdun; Tek bir makinedeki çekirdek sayısı arttıkça, İşlevsel Programlama giderek daha yaygın hale gelecektir. İçsel durum eksikliği, işlevsel programları işlemcilere mekanik olarak bölmeyi kolaylaştırır (yani, tamamen işlevsel bir programınız varsa, derleyici teorik olarak paralellik için sizin açınızdan en az çabayla paralellik gösterebilir) youtube.com/watch? v = NWSZ4c9yqW8 veri paralelliğinin tartışılması için).
Inaimathi

1
@Inaimathi Ditto. İşlevsel programlama çok ölçeklenebilir, bu nedenle çok çekirdekli mimarilere mantıklı geliyor.
EricBoersma

İlk yorumumun, ek bir açıklama içerecek şekilde cevap düzenlenmeden önce yazıldığını unutmayın.
Inaimathi

Bunun için özür dilerim. Sadece bu noktayı unuttum.
LennyProgrammers

Genelde işlevsel derleyicilerin OOPS kadar optimize edilmiş makine kodunu üretemeyeceği genel olarak kabul ediliyor mu? Bunun neden doğru olması gerektiğine dair hiçbir teorik sebep düşünemiyorum; ve bir OOPS'de olduğundan daha gelişmiş optimizasyonların mümkün olduğunu düşünebilirim.
Jeremy

7

Bugünün dağıtık bilgisayarlara ihtiyacı var.

FP, durumları olmayan yapı taşları olarak işlevler kullanır, bu yüzden n'i aynı parametrelerle çağırmak , her zaman aynı değeri döndürmelidir, yan etkileri yoktur.

Böylece, aynı işlevi, işi paralel olarak yapmak ve yapmak için bir grup makineye gönderebilirsiniz.

OO paradigmasında, bu biraz daha zordur, çünkü yapı taşları neredeyse tanımı gereği nesnelerdir. Aynı yöntemi birkaç kez çağırırsanız, verilerin bozulmasını önlemek için dahili verileri senkronize etmede dikkatli olmanız gerekir. Halen mümkün olsa da, hesaplamanın dağıtılması gereken bazı senaryolarda FP paradigması OO'dan daha iyi çalışır.

FP'nin (ve bir dereceye kadar NoSQL'in) ortaya çıkışı, şaşırtıcı bilişim ile ilgili hikayelerin paralel olarak çalışan yüzbinlerce bilgisayarda sonuçlanmasının ve bunun ne kadar kolay olduğunu ortaya koyuyor.

Ancak muhtemelen bu yalnızca bu tür bir kuruluma ihtiyaç duyan uygulama türlerinden biridir. Diğer birçok uygulama / sistem için, prosedür ve OO gayet iyi çalışıyor.

Öyleyse, programlama ufuklarımızı genişletmek ve bir zamanlar akademinin ötesine geçmeyeceğini düşündüğümüz bu kavramları yeniden ele almak üzere.

Yıllar önce Lisp'te programlamayı öğrendim ve o zaman bunun FP olduğunu bile bilmiyordum. Şimdiye kadar neredeyse onunla ilgili her şeyi unuttum, ama kesinlikle özyineleme gibi kavramları çok kolay anlamama yardımcı ol.


2
Soru, FP benzeri dillerin avantajlarını soruyor . Tanımladığınız şey, geleneksel diller kullanılarak da yapılabilir.
Pacerier

6

Çok çekirdekli işlemenin yalnızca bilim laboratuvarlarının arka odalarında veya özel donanımda yapılmadığı bir döneme giriyoruz. Şimdi emtia işlemcileri ile yapılıyor. İşlevsel programlama, en azından maruz kaldığım değişkenlerin çoğu, genellikle yan etki göstermeyen, vatansız hesaplamalı birimler hakkında görüş vermeye çalışır. Bu, çok çekirdekli işler için durumun temel paradigmasıdır; çünkü işlemciler arasında devleti birleştirmeye gerek yoktur.

Bu sebeplerden sadece bir tanesi fakat fonksiyonel programlamanın geçerli olduğunu görmek için çok iyi bir sebep.


5

Bence bu sorunun asıl cevabı 'maruz kalma'.

İşlevsel programlama yeni değil, 12 yıl önce üniversitede Haskell'e öğretildim ve çok sevdim. Ancak, meslek çalışmalarımda dili nadiren kullanıyorum.

Son zamanlarda, çoklu paradigma yaklaşımı kullanan ana akımda çekişen birçok dil olmuştur; F # , JavaScript ana örneklerdir.

Özellikle JavaScript, özellikle jQuery veya Prototype gibi fonksiyonel bir stil dili ile kullanıldığında , dinamik modern web sitelerinde yapılan tüm çalışmalardan dolayı birçok insan için günlük bir dil haline geliyor. İşlevsel stile maruz kalma, insanların özellikle istedikleri bir zorunluluk stiline geri dönebilecekleri zaman, verdiği gücü fark etmelerini sağlar.

İnsanlar bir kez maruz kaldıklarında, fonksiyonel dillerin daha kapsamlı çeşitlerini denerler ve günlük işler için kullanmaya başlarlar.

F #, Visual Studio 2010'da birinci sınıf bir dil haline geldiğinde ve jQuery (ve diğerleri) çok önemli hale geldiğinde, sadece izole programlarla oynamak ya da izole etmek için belirsiz bir şey yapmak yerine bu dilleri kullanmak gerçekçi hale geliyor.

Kodun sürdürülebilir olması gerektiğini unutmayın - kritik bir geliştirici kitlesi, şirketlerin kendilerini kullanırken kendilerini güvende hissetmeleri için dilleri kullanmalı ve desteklemelidir.


3

Gelen bu konuşma Anders Hejlsberg konu üzerine görüşünü açıklıyor.

[DÜZENLE]

Üzgünüz, bağlantı yanlıştı. Şimdi doğru yere işaret ediyor.

Bir saatlik konuşmanın bazı noktalarının son derece kısa özeti:

FLS yazılmış programlar genellikle daha fazla konsantre böylece Fonksiyonel dilleri, prosedürel dilde daha programlamanın daha bildirim stil için izin neyi yerine how . Zarif matematiksel yapıları nedeniyle FL'lerin derleyiciler tarafından optimize edilmesi ve dönüştürülmesi de kolaydır; bu, aynı zamanda meta programlama ve gömülü DSL'lerin yapımını da kolaylaştırır. Bütün bunlar birlikte fonksiyonel programları prosedürel programlardan daha öz ve öz belgelendirir.

Ayrıca, yakın geleceğin çok çekirdekli dönemi karşısında, programlama dillerinin çoklu iş parçacığı / işlemeyi farklı şekillerde kullanabilmesi gerekir. Tek çekirdekli makinelerde çoklu diş çekme, zaman paylaşım mekanizmasıydı ve sistemlerin mimarisi bunu yansıtıyordu. Çok çekirdekli makinelerde çoklu diş açma çok farklı olacaktır. İşlevsel diller, özellikle durumdan kaçındıkları için paralellik için özellikle uygundur, bu nedenle paylaşılabilir değişken verilerin bütünlüğü hakkında endişelenmenize gerek yoktur (çünkü paylaşılabilir değişken veriler olma eğiliminde değildir).


1
Özetler misiniz

1
@Thorbjorn Bu bana özetleyemeyen adamı hatırlatıyor . (Bunu size yöneltmemek, yazara cevap vermek.)
Mark C

1
Bağlantı doğru yere bile bağlantı vermiyor.
Ken Bloom

2

İşlevsel programlama paradigması ile web için programlama arasındaki yakın ilişki ile ilgili olduğunu düşünüyorum.

Ruby on Rails, fonksiyonel (heh heh) web uygulamasına çok hızlı bir yol sunduğu için tüm işlevsel programlama yaklaşımını keskin bir rahatlamaya getirdi. Orada SO üzerinde ilginç bir tartışma bu konuda ve belirli bir cevap öne çıkıyor:

İşlevsel programlama web uygulamalarını çok iyi eşleştirir. Web uygulaması bir HTTP isteği alır ve bir HTML sonucu oluşturur. Bu isteklerden sayfalara bir fonksiyon olarak kabul edilebilir.

Genelde uzun süren bir işlemin, durum bilgisi olan bir kullanıcı arayüzünün ve birkaç yönde veri akışının olduğu masaüstü uygulamalarıyla karşılaştırın. Bu durum, durum geçiren nesneler ve mesaj iletimi ile ilgilenen OO için daha uygundur.

İşlevsel programlamanın uzun zamandır ortada olduğu göz önüne alındığında, neden Greenfield web projeleri için Lisp geliştiricileri arayan pek çok iş ilanını göremediğimi merak ediyorum.


İşlevsel analojinin web'e sadece tesadüfi olarak uygulandığını düşünüyorum, çünkü temel protokol vatansız. Web uygulamaları gerçekten vatansız değil, aslında her zaman bir şekilde HTTP üzerinde çalışmak zorunda olmamızın bir nedeni.
Mladen Jablanović

@Mladen Hmmm, istemci-sunucu iletişim durumunu (HTTP) uygulama durumu (DAO'lar vb.) İle karıştırmanız mümkün mü? Stefan Tilkov'u buradan alıntı yapmak ( codemonkeyism.com/stateless-applications-illusion ) "Bir web uygulamasında, her bir bireysel istek, önceki bir isteğin gerçekleşip gerçekleşmediğinden bağımsız olarak işlenebilecek kadar bilgi içermelidir. Kalıcı sunucu tarafı kaynağı durum iyi, müşteri tarafı durum iyi, geçici iletişim (oturum) durumu ölçeklenebilirliği ve yer imini bozabileceği için değil. ” Bu REST'in temelidir.
Gary Rowe

1
Lisp geliştiricileri için neden çok fazla iş ilanı bulunmadığını daha iyi anlamak için paulgraham.com/avg.html sayfasını okumak isteyebilirsiniz .

@ Thorbjørn Ravn Andersen İyi bir yazı. Lisp editörümden ayrılmam için bana ilham veriyor.
Gary Rowe

1

İşlevsel programlama bana, " vay, bu yeni " nin karıncalanma hissini, yıllar önce nesnelerle uğraşmaya başladığımda olduğu gibi veriyor .

FP'nin şimdiye kadar yeni bir kavram olmadığını fark ettim, ancak 90'lı yıllarda gerçek bir mola verdiğinde OO değildi. Bu, büyük ölçüde Java'nın ve daha sonra C # 'nın zamanında başarısından dolayıydı.

Aynı şeyin bir sonraki dil grubu, aynı şekilde yayılmaya başladığında FP'de de olacağını hayal ediyorum. Zaten sahip oldukları gibi, en azından bazı çevrelerde, Scala ve F # gibi dillerle.


OO, FP'den çok daha gençtir, ancak daha önce ilgi odağına girdi. Sanırım parantez çok fazla insanı korkuttu
Javier

1

İşte benim sorularım: 1. Son FP heyecanına neler katkıda bulundu? OO ile sadece can sıkıntısı mı var, yoksa FP'yi öncekinden daha çok ihtiyaç duyulan bir şey mi değiştirdi? 2. Bu bir FP geleceğinin göstergesi midir? Yoksa bu nesne yönelimli veritabanları gibi bir soluk mudur?

Diğerleri teknik olarak iyi bir sebep verdi.

Bence FP, ortalama geliştirici ve yönetici tipleri arasında çekiş kazanmanın ana nedeni, çok çekirdekli işlemcilerin daha iyi kullanılmasına izin vermesidir. FP okuduğum her şeyden daha kolay (kolay değil) paralel programlama sağlar.

Gelecekte yaygın kullanımı, sözün gerçek olması ve yerine getirilmesi durumunda olacaktır.


Bu büyük bir "eğer". COBOL, "İngilizce" olmak, herkesin programlayabileceği anlamına geliyordu. AI programlamayı eski hale getirecekti. OO, programlama işlemini tinkertoys montajı kadar basit hale getirecekti. Kodlayıcılar rock grupları gibi, her zaman "bir sonraki büyük şeyi" arıyorlar ve ondan sonra bir tane ve ...
Mike Dunlavey

0

Bence bu iki trendin bir birleşimi:

  1. İşlevsel özellikler, ana dillere eklenir (örneğin, C #).
  2. Yeni fonksiyonel diller oluşturuluyor.

Muhtemelen ilk eğilimde doğal bir sınır vardır, ancak benim tahminime göre, herhangi bir yeni dilin ciddiye alınabilmesi için en azından bir seçenek olarak fonksiyonel programlamayı desteklemesi gerekecek.


0

İnsanların, işletim sisteminin yerel API'lerini kullanarak masaüstünde çalışacak programlar yazdığı ve bu API'lerin (genellikle) C dilinde yazıldığı, bu yüzden çoğunlukla yerel API'ler için bir program yazmak istiyorsanız, bu programı C de yazdı

Son 10 yıldaki yeni inovasyonun, özellikle platform API'lerinin alakasız olduğu web geliştirme gibi (özellikle bir web sayfasını oluşturmak, dizge manipülasyonunu içerdiğinden) yakalaması gereken çeşitli API'ler için olduğunu düşünüyorum. Doğrudan Win32 API'sine veya POSIX API'sine kodlamadığınızdan, bu, insanlara işlevsel dilleri deneme özgürlüğü verir.


0

Bu zarif ve şık ve beyninizi gıdıklıyor. Bu iyi.

Ayrıca, IMHO, klasik bir grup arabası. Bir problem arayan bir çözüm.

Mühendisler tarafından kurulan ve bir süredir parlak yanan, favori bir fikirle göz kamaştıran tüm bu başlangıç ​​şirketleri gibi, ancak ihtiyaç duyulanı sağlamaya çalışan şirketler tarafından sessizce üstlenildi.

Şık fikir temelli programlamayı değil, ihtiyaç temelli programlamayı görmek istediğim yeni fikir bu. Belki sıradan sesler, ama bence oldukça yaratıcı ve şık olabilir.


-1

Kesinlikle F # nedeniyle, bazen hangisinin neden ve hangisinin etkisinin olduğunu söylemek zor olsa da.

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.