İnternette F # ve Haskell arasındaki karşılaştırmaları araştırdım, ancak gerçekten kesin bir şey bulamadım. Birincil farklar nelerdir ve neden birini diğerine tercih etmek isteyeyim?
Yanıtlar:
Haskell, F # hem zorunlu / OO hem de işlevsel dillerin yönlerine sahip olduğu "saf" işlevsel bir dildir. Haskell ayrıca, işlevsel diller arasında oldukça nadir görülen tembel bir değerlendirmeye sahiptir.
Bu şeyler ne anlama geliyor? Tamamen işlevsel bir dil, hiçbir yan etkinin (veya bir işlev çağrıldığında paylaşılan durumda değişikliklerin) olmadığı anlamına gelir; bu, f (x) 'i çağırırsanız, işlevden bir değer döndürmekten başka hiçbir şeyin olmayacağı garanti edildiği anlamına gelir. konsol çıktısı, veritabanı çıktısı, genel veya statik değişkenlerdeki değişiklikler gibi ... ve Haskell saf olmayan işlevlere (monadlar aracılığıyla) sahip olsa da, bildirim yoluyla 'açıkça' ima edilmelidir.
Sayısız kilit ve semafor yerine paylaşılan durum olmadan hata yapmak çok daha zor olduğundan, çok çekirdekli eşzamanlılığa iyi bir şekilde katkıda bulunduğundan, saf işlevsel diller ve 'yan etki yok' programlama son zamanlarda popülerlik kazanmıştır.
Tembel değerlendirme, kesinlikle gerekli olana kadar bir işlevin DEĞERLENDİRİLMEDİĞİ yerdir. bu, gerekli olmadığında birçok işlemden kaçınılabileceği anlamına gelir. Bunu, aşağıdaki gibi temel bir C # if cümlesinde düşünün:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
Yanlışsa IsSomethingTrue()
, AnotherThingTrue()
yöntem asla değerlendirilmez.
Haskell harika bir dil olsa da, F # 'ın (şimdilik) en büyük yararı, CLR'nin en üstünde yer almasıdır. Bu, kendisini çok dilli programlamaya verir. Bir gün, ASP.net MVC'de web kullanıcı arayüzünüzü, C # ile iş mantığınızı, F # ile temel algoritmalarınızı ve Ironruby'de birim testlerinizi yazabilirsiniz ... Hepsi .Net çerçevesi arasında.
Haskell hakkında daha fazla bilgi için Simon Peyton Jones ile Yazılım Mühendisliği radyosunu dinleyin: Bölüm 108: Fonksiyonel Programlama ve Haskell hakkında Simon Peyton Jones
Büyük farklar:
Benzerlikler farklılıklardan daha önemlidir. Temel olarak, zaten .NET üzerindeyseniz F # kullanmalısınız, aksi takdirde Haskell. Ayrıca, OO ve tembellik, F # 'nın (muhtemelen) zaten bildiğiniz şeye daha yakın olduğu anlamına gelir, bu nedenle öğrenmesi muhtemelen daha kolaydır.
Platform: Haskell'in kendi çalışma zamanı vardır, F # .NET kullanır. Optimizasyondan önce ortalama kodun aynı olduğundan şüphelenmeme rağmen performans farkının ne olduğunu bilmiyorum. NET kitaplıklarına ihtiyacınız varsa F # avantajına sahiptir.
Nesne yönelimi: F #, OO'ya sahiptir ve kodunuz OO olmasa bile .NET sınıflarının kullanımının kolay olduğundan emin olmak için çok dikkatlidir. Haskell, garip bir şekilde OO gibi bir şey yapmanıza izin veren tip sınıflarına sahiptir. Common Lisp genel işlevleriyle çaprazlanmış Ruby karışımları gibidirler. Java / C # arayüzlerine benziyorlar.
Tembellik: Haskell tembeldir, F # değildir. Tembellik bazı güzel numaralar sağlar ve yavaş görünen bazı şeylerin aslında hızlı yürütülmesini sağlar. Ancak kodumun ne kadar hızlı çalışacağını tahmin etmek çok daha zor. Her iki dil de diğer modeli kullanmanıza izin verir, sadece kodunuzda bunun hakkında açık olmanız gerekir.
Küçük farklılıklar:
F #, ML ailesinin bir parçasıdır ve OCaml'e çok yakındır. Haskell ve OCaml arasındaki farklar hakkındaki bu tartışmayı okumak isteyebilirsiniz .
Muhtemelen saflığın bir sonucu olan ancak daha az bahsettiğim kadarıyla büyük bir fark, monadların yaygın kullanımıdır. Sıklıkla belirtildiği gibi, monadlar herhangi bir dilde inşa edilebilir, ancak kütüphanelerde yaygın olarak kullanıldıklarında yaşam büyük ölçüde değişir ve bunları kendiniz kullanırsınız.
Monadlar, diğer dillerde çok daha sınırlı bir şekilde görülen bir şeyi sağlar: akış kontrolünün soyutlanması. Her türlü şeyi yapmanın inanılmaz derecede kullanışlı ve zarif yolları ve bir yıllık Haskell, programlama yöntemimi tamamen değiştirdi, tıpkı yıllar önce zorunlu programlamadan OO programlamaya geçmenin onu değiştirdiği gibi veya çok daha sonra, üst düzey işlevleri kullanmak yaptı.
Ne yazık ki, böyle bir alanda, farkın ne olduğunu görmenize izin verecek kadar anlayış sağlamanın bir yolu yoktur. Aslında, hiçbir yazı bunu yapmaz; gerçek bir anlayış kazanmak için kod öğrenmek ve yazmak için yeterli zaman harcamanız yeterlidir.
Ayrıca, .NET platformu / kitaplıkları ile arabirim oluşturduğunuzda, F # bazen biraz daha az işlevsel veya daha garip hale gelebilir (işlevsel programlama bakış açısından), çünkü kitaplıklar açıkça OO açısından tasarlandı.
Yani kararınızı şu şekilde düşünebilirsiniz: hızlı, nispeten küçük bir gelişme artışı elde etmek için bu dillerden birini mi denemeye çalışıyorsunuz yoksa daha fazla zaman ayırıp daha büyük bir şey için daha az anında fayda mı elde etmek istiyorsunuz Uzun dönem. (Ya da en azından, daha büyük bir şey elde edemezseniz, diğerine hızlı bir şekilde geçme yeteneği?) Birincisi, F # sizin seçiminizse, ikincisi ise Haskell.
Birkaç alakasız nokta:
Haskell'in tasarımcıları ML'yi oldukça iyi bildiği için Haskell'in biraz daha hoş sözdizimi var, bu da sürpriz değil. Bununla birlikte, F # 's' hafif 'sözdizimi, makine öğrenimi sözdizimini geliştirmek için uzun bir yol kat ediyor, bu nedenle burada çok büyük bir boşluk yok.
Platformlar açısından, F # elbette .NET'dir; Bunun Mono'da ne kadar işe yarayacağını bilmiyorum. GHC, kendi çalışma zamanına sahip makine kodunu derler, hem Windows hem de Unix altında iyi çalışır, bu da .NET ile aynı şekilde C ++ ile karşılaştırılır. Bu, bazı durumlarda, özellikle hız ve daha düşük seviyeli makine erişimi açısından bir avantaj olabilir. (Haskell / GHC'de bir DDE sunucusu yazmakta sorun yaşamadım, örneğin; bunu herhangi bir .NET dilinde yapabileceğinizi düşünmüyorum ve ne olursa olsun, MS kesinlikle bunu yapmanızı istemiyor.)
Birincisi, temel bir avantajın F # 'nın .NET platformuna karşı derlenmesi ve bu da Windows üzerinde konuşlandırmayı kolaylaştırmasıdır. Web uygulamaları oluşturmak için ASP.NET ile birlikte F # kullanarak açıklanmış örnekler gördüm ;-)
Öte yandan, Haskell daha uzun süredir ortalıkta dolaşıyor, bu yüzden bu dil konusunda gerçek uzman olan insan grubunun çok daha büyük olduğunu düşünüyorum.
F # için şimdiye kadar yalnızca bir gerçek uygulama gördüm, bu da OS konseptinin Singularity kanıtıdır. Haskell'in daha gerçek dünya uygulamalarını gördüm.