Fonksiyonel Programlama Bağımsız Değişkenleri [kapalı]


10

Son zamanlarda eğlence için F # öğreniyorum (Ben bir VB.NET/C# dev) ve gerçekten sunduğu şeylerden bazılarını seviyorum. Teorik olarak. Ama ben C # yerine F # kodlamak için tercih senaryoları düşünürken sorun yaşıyorum. Herhangi bir fikir?


2
F#işlevsel programlamayı tam olarak temsil etmez. ClojureBunun yerine deneyin .
İş

1
F # bilmiyorum ama aklımın patlamasını istediğimde Haskell kullanıyorum. Şimdiye kadar her zaman çalıştı;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey bu konuda harika bir video (OO ve Fonksiyonel)
mikera

Dinamik bir işlevsel dil mi? İstediğiniz kadar sahip olabilirsiniz. : P
Erik Reppen

Yanıtlar:



6

Ben C # yerine F # kodlamak için tercih senaryoları düşünürken sorun yaşıyorum. Herhangi bir fikir?

Gönderen burada :

Eşzamansız sunucular

  • Eşzamansız IO için eşzamansız iş akışları.
  • İleti güvenli ileti geçirme için posta kutusu işlemcisi.
  • Sunucu durumu ve ileti kataloğu için birleşim türleri.
  • Durum makineleri için desen eşleştirme ve kuyruk özyineleme.

Meta programlama (örn. Ayrıştırma)

  • Fslex ve fsyacc gibi ayrıştırıcı jeneratörleri.
  • FParsec gibi ayrıştırıcı birleştiriciler.
  • Zarif elle yuvarlanan ayrıştırıcılar için aktif desenler.
  • Ayrıştırma ağaçlarını temsil eden cebirsel veri türleri.
  • Ağaçları manipüle etmek için desen eşleştirme, örneğin optimizasyon aşamalarını uygulayın.
  • Hızlı kod çalışma zamanı üretimi için yansıma.

Teknik hesaplama

  • Zarif ve hızlı algoritmik kod için üst düzey fonksiyonlar.
  • Sembolik manipülasyon için cebirsel veri tipleri ve örüntü eşleme.
  • Zengin .NET kitaplığı için birlikte çalışabilirlik.
  • F # interaktif kullanarak etkileşim.
  • Verilere masaj yapmak için hesaplama ifadeleri.
  • İyileştirilmiş doğruluk için ölçü birimleri.

GUI uygulamaları

  • Kullanıcı arabirimi kodu ile uygulama mantık kodu arasında geçen zaman uyumsuz mesaj olarak modelleme yapın.
  • Üst düzey işlevler kullanıcı arabirimlerini bildirimsel olarak tanımlamanızı sağlar.

Mantık programlama

  • Kolay geri izleme için kalıcı koleksiyonlar.
  • Kuyruk güvenilirlik gerektirir.
  • Kolay jenerik programlama için otomatik genelleme.

Test yapmak

  • Birim testlerini etkileşimli olarak gerçekleştirin.
  • BDD, tercüman yazmak anlamına gelir.
  • Test kayışlarını yazmak ve sonuçları görselleştirmek için iyi komut dosyası dili.

Verim

  • inline ücretsiz yüksek dereceli soyutlama için.
  • Kuyruk hızlı durum makineleri gerektirir.
  • Düşük gecikme süresi için tamamen işlevsel veri yapıları.
  • Optimize edilmiş kod üretimi için meta programlama.

F # veya C # bilmediğimi itiraf edeceğim, ancak F #'da birkaç gün geçirmenizi ve ne düşündüğünüzü görmenizi öneririm. REPL kullanmak aklıma bunu destekleyen herhangi bir dilde büyük bir galibiyettir
Zachary K

5

İşlevsel stil programlamayı günlük olarak daha fazla veya daha az temelde kullanan şey.

Oldukça büyük veri kümeleriyle birçok istatistiksel ve aktüeryal şey yapıyoruz. Veritabanından getirilen veriler - esasen statik, değişmez nesnelerdir. Yöntemlerle bir sınıf oluşturmak için hiçbir neden yoktur.

Hesaplamanın her aşaması bazı ek ayrıntılar ekler, ancak nesneyi esasen değiştirmez. Boru hattının "sonunda", toplamları ve sayıları ve diğer şeyleri hesaplamak için gerçekten fantezi bir azalma yapıyoruz.

Bunu hayal edin.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Hesaplamanın her "aşaması", basit okuma-hesaplama-verimi yapan ve diğer şeylerin ve sonuçların birleşik bir nesnesini oluşturan fonksiyonel bir programlama döngüsüdür.

(Python kullanıyoruz, dolayısıyla jeneratör fonksiyonlarını kullanarak fonksiyonel programlama yapıyoruz.)

Vatansız, değişmez nesneler kullanmak daha kolaydır.


Python'un bu F # ile eşdeğeri var mı? criteria() |> some_query |> calculate |> enrich |> summarizeIleri boru operatörü daha net bir kod yol açabilir buluyorum ama kazmak.
ChaosPandion

@ChaosPandion: İlk olarak, bu sözdizimi beni şaşırtıyor. Ama bazı insanlar bundan hoşlanıyor gibi görünüyor. Sayısız Python paketi var. Eminim bunu SO'da arayabilir ve bir cevap bulabilirsin.
S.Lott

@Chaos: Bildiğimden değil. genellikle mapaynı etkiyi elde etmek için beste yaparım .
Paul Nathan

4

Teknik olarak, işlevsel bir programlamanın benzersiz bir özelliği değildir ve F #, saf bir işlevsel dil değildir. ML torunlarından biri olan F #, mükemmel bir desen eşleştirme ve cebirsel veri türleri sağlar. Bu nedenle, karmaşık veri yapıları gerektiren herhangi bir görev için F #, C # 'dan çok daha etkileyici ve kullanımı kolaydır.

C # ve F # 'da soyut bir sözdizimi ağacını temsil eden ve üzerinde dönüşüm gerçekleştiren bir derleyici uyguladığınızı düşünün.


2

Harita azaltma türünde muazzam çok sistemli ve muazzam çok çekirdekli paralellik için ideal. Günümüzde giriş seviyesi sunucuların 48 çekirdek (96 sayım HT) ile geldiği göz önüne alındığında oldukça güzel.


2

Tamamen işlevsel Haskell denemek istiyorsanız, Erlang'ın da çok güzel şeyler var.

Simon Payton-Jones Haskell hakkında, açık bir hata yerine açık bir şekilde hata içermeyen bir programa sahip olmak istediğini söyledi.

(Muhtemelen teklifi biraz aldım, ama fikri anladın)

Yan etkileri kısıtlayarak, kodunuzun doğru olduğunu kanıtlamayı çok daha kolay hale getirirsiniz.


1

Kesin bir avantajı, çok daha kolay paralelleştirilmesidir.


2
Saflıktan bahsediyorsunuz ve bariz bir dezavantaj, saflığın programları daha yavaş hale getirme eğiliminde olmasıdır. Yani paralel + saf ille de iyi bir şey değildir.
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.