İyi bir ilk fonksiyonel programlama projesi ne olurdu? [kapalı]


19

İyi bir ilk fonksiyonel programlama projesi ne olurdu?

Lisans projemde bir patlama ile bitirmek istiyorum ve fonksiyonel bir programlama projesi ile bitirmek istiyorum. Okulda çalışmadık, ancak kendimizi yeni şeyler öğrenmeye teşvik ediyoruz ve yeni bir paradigma öğrenmek sadece yeni bir dil öğrenmek için değil, muhtemelen öğretmenlerin de görmesi için ilginç bir şey olacağını düşündüm. .

Sorun şu ki, yaz tatilinden yararlanmak ve fonksiyonel programlamayı daha iyi anlamak ve bir dile aşina olmak için projemden biraz önce başlamak istiyorum.

Ne söyleyecektim, biraz zorlayıcı ama aynı zamanda dili, paradigmayı vb. Öğrenmeme izin veren iyi bir uygulama projesi olurdu. Ve sonra lisans projem için iyi bir proje (daha gelişmiş bir proje) ne olurdu?

Fonksiyonel programlamaya girerken başlamak için en iyi dilin önerileri de takdir edilecektir.


1
"Hangi dili seçmeliyim" ve proje seçim sorularının her ikisi de konu dışı. Daha fazla bilgi için lütfen SSS bölümüne ve bu meta tartışmaya bakın.
Adam Lear

Yanıtlar:


10

Nispeten matematiksel veya mantıksal bir şey arıyorsanız genellikle daha kolaydır - işlevsel programlama dilleri, belirli bir girdiden çıktıya bir tür dönüşüm temsil eden uygulamalar için genellikle çok uygundur.

Bazı fikirler, zor zorluk derecesinde:

  • Genetik algoritmalar - çözümlerin basit bir DSL'de temsil edildiği belirli bir göreve çözümler geliştiren bir program yazın. 2D bir ızgarada yiyecek arayan ve farklı stratejiler geliştiren küçük botlar inşa etmeden önce eğlendim

  • Ayrıştırıcıları ayrıştırır - daha üst düzey işlevleri kullanarak rastgele bir dil için ayrıştırıcı oluşturmanıza olanak tanıyan bir ayrıştırıcı birleştirici kitaplığı oluşturun.

  • Gerçekten bir meydan okuma istiyorsanız, bir bilgisayar oyunu yazmayı deneyebilirsiniz ... oyunların işlevsel bir programlama tarzında yönetilmesi zor olabilen çok fazla değişebilir duruma sahip olduğu için bunun zor bir görev olduğunu unutmayın. Monadlar vb. Hakkında bilmek istediğinizden daha fazlasını öğrenmeyi umuyoruz .....

Clojure'u pragmatik bir işlevsel dil olarak tavsiye ederim. Yaklaşık 18 aydır kullanıyorum ve seçimden son derece memnunum. Ana nedenler:

  • Eşzamanlılık - Clojure, bence çok çekirdekli eşzamanlılık için onu şu anda dünyadaki en iyi dil haline getiren inanılmaz bir STM sistemine sahiptir. Bunun neden bu kadar özel olduğunu anlamak istiyorsanız http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey adresindeki videoyu izleyin.
  • Bu bir Lisp - "kod veri" felsefesi nedeniyle makro tabanlı metaprogramlama (programlar yazan programlar, genetik algoritmalar vb.)
  • Pragmatik fonksiyonel programlama - Clojure stili çok işlevseldir (yüksek dereceli fonksiyonlara, tembel sekanslara vb. Vurgulanır), ancak Haskell gibi tamamen saf değildir. Mtable durumu ve yan etkileri ele almak için birçok güzel araç var
  • Dinamik - Clojure varsayılan olarak dinamik bir dildir. Bunu verimlilik için büyük bir destek olarak görüyorum. Ancak, statik yazmanın performans avantajlarından yararlanmak istiyorsanız, isteğe bağlı olarak daha sonra statik tür ipuçları ekleyebilirsiniz.
  • Tamamen derlenmiş - Clojure kodu her zaman uyulur ("eval" yapsanız bile), böylece oldukça iyi bir performans elde edersiniz - kesinlikle kullandığım çoğu dinamik dilden daha iyi.
  • JVM ekosistemindeki tüm kütüphanelere ve araçlara ücretsiz olarak erişebilirsiniz . Bu nedenle, çok sınırlı kütüphaneye sahip akademik dillerin aksine, Java evrenindeki her şeye kolayca erişebilirsiniz

Temel bilgileri aşağıdakilerle kolayca deneyebilirsiniz:


Soru için cevabınızı seçtim çünkü tüm sorularıma cevap verdi. Zaman ayırdığınız için çok teşekkür ederim.
Meme

Haskell'in de STM'si var; (
alternatif

@mikera: JVM ile çalışmak için ABCL'yi denediniz mi? Denedim ve sadece küçük bir örnek yaptım ama neredeyse hiç deneyimim yok. (Yapılacaklar listemde de bir Clojure kitabım var, ancak bu başka bir hikaye, ABCL ve Java ile çalışma deneyiminiz olup olmadığını merak ediyorum).
Giorgio

@Giorgio: ABCL, JVM'de Common Lisp'in iyi bir uygulaması gibi görünüyor. OTOH Clojure, JVM için tasarlanma, çok daha "modern" yenilikleri bir araya getirme ve daha fazla topluluk momentumuna sahip olma avantajlarına sahiptir. Bence Common Lisp'in geriye dönük uyumluluğunu korumayı umursamıyorsunuz.
mikera

9

Belirli projeleri düşünmeye başlamadan önce, fonksiyonel programlamanın temellerini öğrenmeye başlayın, böylece iyi bir uyum sağlayacak proje türleri hakkında iyi bir fikir edinebilirsiniz.

Başlamak için en iyi yer muhtemelen Bilgisayar Programlarının Yapısı ve Yorumudur Lisp'in Şema lehçesine dayanan (SICP). Bu klasik bir CS metnidir ve tam metin çevrimiçi olarak mevcuttur (bağlantı sağlanmıştır).

Süslü olmak ve JVM'yi hedefleyen daha modern bir işlevsel dil kullanmak istiyorsanız, Clojure'a bir göz atın. SICP'in özel olarak Clojure için uyarlanmış bir versiyonu bile var .

SICP metnini incelediğinizde, işlevsel programlamanın belirli görev türlerine neden bu kadar uygun olduğu hakkında bir fikir edineceksiniz ve alıştırmalar tam teşekküllü bir projeye ilham verebilir. Eğer Clojure yol gitmek seçin ve bazı mevcut projelerini incelemek istiyorsanız, bazı iyi bağlantılar vardır burada .


Kitabın bağlantısını sağladığınız için teşekkür ederiz. Daha iyi anlamak için bunu okuyacağım.
Meme

Bugün SICP'nizi okudunuz mu?
MattyD

3

Nicel analiz

Finansı fonksiyonel programlama ile bazı miktarlar yapmak ilginç bulursanız, çok algoritmik olduğu için iyi bir eştir. Portföy teorisi ve sharpe ve sortino oranları vb. Şeylerden bahsediyorum. Bir fonun getirilerini analiz eden ve farklı istatistikler, diyagramlar vb.

F # 'ı öneriyorum çünkü başlamak için kolay bir işlevsel dil, iyi araçlar ve onu destekleyen iyi bir çerçeve var. Diğer alternatifler lisp ve clojure'dur, ancak öğrenmeleri biraz daha zordur.


Yüksek seviyede, işlevsel bir şekilde birçok şey yapabileceğiniz doğrudur. İnsanlar, örneğin egzotik seçenek getirilerini tanımlamak için fonksiyonel diller kullandılar. Ancak, PCA hesaplamak, doğrusal olmayan denklemleri çözmek, vb.Gibi zemin seviyesine inerken, algoritmalar gittikçe yinelemeli hale gelir ve bunları eski tarzda kodlamaktan daha iyi olursunuz.
quant_dev

1
Deneyimlerime göre, nicel analizin tamamen algoritmaları seri üzerinden çalıştırmakla ilgili olduğunu söyleyemem. Ben C #
nicelik

Algoritmaların kendileri uygulamaları ne olacak?
quant_dev

Çoğu durumda sorun görmüyorum, değil mi? Bir keskinlik oranı hesaplayın, önce bir getiri serisinden yıllık getiriyi hesaplayın, sonra bu değeri risksiz bir oran ve oynaklıkla kullanın: (yıllıklandırılmışReturn - riskFreeRate) / volatilite. İşlevsel bir dil işleyemez
Homde

Fiyatlandırma kalibrasyonuna ne dersiniz?
quant_dev

3

Bir başlangıç ​​için, F # 'da küçük bir blackjack oyunu uygulamaya çalışabilirsiniz. Bu, bu kısa video eğitimi sırasında verilen bir ödev projesidir . Ayrıca net (ve videolardan birinde) çözüm sağlanır.


2

OCaml ile şema veya lisp için bir tercüman yazabilirsiniz.


Ayrıca, haskell'de yazma şeması hakkında bu konuda bir haskell kitabı bile var.
alternatif

2

Hangi işlevsel dili düşünüyordunuz? Her birinin farklı özellikleri vardır. Benim üzerimde en büyük etkiyi yaratan tek dil Haskell idi ve ben de aynısını yapmanızı öneririm.


Dürüstçe F # 'ı düşünüyordum çünkü Danimarka'da Microsoft her şey popülerdi, ancak farklı fikirleri ne kadar çok okursam, bu karardan şüpheliyim. Temel olarak paradigmayı öğrenmeme yardımcı olacak bir dil istiyorum ve emin olduktan sonra ihtiyacım olursa veya öğrenmek istediğimde başka bir dil öğrenmek zor değil.
Meme

Kesinlikle nerede olduğunuza ve ne yaptığınıza bağlıdır. Bizim için Microsoft programlama teknolojileri, ana platformumuzu desteklemedikleri için işe yaramaz. Ama konuya giriyorum: F # kullanmak istiyorsanız harika, ama sonra yeni bir F # sorusu açın.

Bunu kullanmak istemiyorum. Henüz bir karar almadım. Kullanılacak dil ile ilgili soru zaten ikincil bir soruydu.
Meme

Bu durumda, bir proje bulun ve nasıl çözüleceğine dair öneriler isteyin. Örneğin Prolog, karar ağacı araması için mükemmeldir. Haskell, desen eşleştirme için mükemmeldir. Lisp, verilerinize bağlı olarak çalışma zamanında Lisp programlarını oluşturmak ve değiştirmek için mükemmeldir.

0

Bazı açık kaynaklı projelere de katkıda bulunabilirsiniz.

Örneğin, Frege programlama dili projesinde yapılacak çok iş var. Örneğin, Haskell kütüphanelerinin temelini taşıyabilirsiniz. Bu, üzerinde çalışırken sizi bir tür Haskell uzmanı yapar.

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.