Haskell ve F # arasındaki temel farklar nelerdir? [kapalı]


135

İ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?


1
F # ile ilgili güzel olan şey, karışık paradigması nedeniyle OO programcısı için daha iyi bir başlangıç ​​noktası sağlamasıdır. Kademeli olarak işlevsel düşünme konusunda hız kazanabilir ve yine de C # 'da olduğu gibi tanıdık OO kitaplıklarını kullanmaya devam edebilir. Haskell, tüm işlevsel enchilada'yı bir kerede size zorlar.
Mario

F # 'ın işlevsel bir programlama dili olmadığına dikkat etmek önemlidir. Ancak FP'den epeyce uyarlandı, bu yüzden belki birçok benzerlik bulmak mümkündür, ancak yine de öncelikle bunların tamamen farklı diller olduğunu söyleyebilirim.
MasterMastic

Yanıtlar:


128

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


8
F # 'ın (duruma bağlı olarak) bir başka potansiyel büyük yararı, tembel olmamasıdır; bu, uzay-zaman davranışı hakkında mantık yürütmek için öğrenme eğrisinin neredeyse herkes için çok daha basit olacağı anlamına gelir.
cjs

5
Doğrudan se-radio Bölüm 108'e bağlantı (Simon Peyton Jones): se-radio.net/podcast/2008-08/…
Herrmann

9
Dikkat çekmeye değer bir diğer özellik de, saf programlamayı zorlayan bir dil olan derleyicinin birçok optimizasyon için çok daha fazla özgürlüğe sahip olmasıdır. Derleyici her çağrının gerekli yan etkileri içerdiğini varsaymak zorunda kaldığından, saflığı teşvik eden ancak yine de denetlenmemiş saf olmayan işlemlerin herhangi bir kod bloğunun içine bırakılmasına izin veren bazı potansiyel optimizasyonlarda kaybedilen F # gibi diller.
Ben

12
@JonHarrop: Bu, derleyici optimizasyonlarının uygulanabilirliği ile ilgisi olmayan algoritmalar hakkında bir açıklama. Zorunlu saflık dilleri genellikle gerçekten ihtiyacınız olduğunda açıkça saf olmayan kod yazmanıza izin verir (başka bir şey değilse, C'yi aramak için bir FFI kullanarak). Derleyici, (bilinmeyen) yan etkilerin sırasını korumak zorunda olmadığında kod dönüşümlerini daha özgürce uygulayabilir. "Teşvik edilmiş saflık" dillerinde, çoğunlukla benzer kodlar yazarsınız, böylece aynı optimizasyonlar uygulanabilir, yalnızca yan etkileri geçersiz kılabilir (ki bunlar yoktur, ancak derleyici bunu varsayamaz).
Ben

3
@JonHarrop Bunların hepsinin algoritma olduğunu ne zaman iddia ettim? Her durumda, Haskell ve C'yi değil, Haskell ve F #'ı karşılaştırıyoruz. F # "teşvik edilen saflık" dilidir, bu nedenle genellikle saf kod yazarsınız. Tüm iddia ettiğim, aynı kodun derleyici tarafından "zorunlu saflık" ayarında daha iyi optimize edilebileceğidir, çünkü F # derleyicisinin çağrıların yan etkileri olduğunu varsayması gerekir. Farklı bir algoritma (yan etkilere bağlı olan) kullanmak için kodu yeniden yazmaktan bahsediyorsunuz; F # ile Haskell arasındaki saf kodun "optimize edilebilirliği" hakkında bilgi alıyorum.
Ben

53

Büyük farklar:

  • Platform
  • Nesne yönelimi
  • Tembellik

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:

  • Sözdizimi: Haskell bence biraz daha güzel sözdizimine sahip. Biraz daha kısa ve düzenli ve türleri ayrı bir satırda bildirmeyi seviyorum. YMMV.
  • Araçlar: Bu tür şeyleri seviyorsanız, F # mükemmel Visual Studio entegrasyonuna sahiptir. Haskell ayrıca daha eski bir Visual Studio eklentisine sahip , ancak betadan çıktığını sanmıyorum. Haskell'in basit bir emacs modu vardır ve F # düzenlemek için muhtemelen OCaml'ın tuareg modunu kullanabilirsiniz.
  • Yan etkileri: zaman iki dilde oldukça açık hale sen değişkenleri mutasyona edilmektedir. Ancak Haskell'in derleyicisi sizi yan etkileri her kullandığınızda işaretlemeye zorlar. Pratik fark, yan etkileri olan kitaplıkları kullandığınızda çok daha fazla farkında olmanız gerektiğidir.

1
performans için bakın . Ne kadar yasal olduğundan emin değilim
nawfal

35

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 .


6
Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse yalnızca bağlantı yanıtları geçersiz hale gelebilir. - Yorumdan
mirabilos

33

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.)


2

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.


4
F #, Haskell'in bir başarı öyküsüne (Darcs) en yakın şeyi gölgede bırakan birkaç büyük başarı öyküsüne (Halo 3, AdCenter, F # for Visualization) sahip olmuştur.
JD

Elbette bunun bir dezavantajı olduğuna dikkat çekmek gerekir. (CLR sınırlamaları)
MasterMastic
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.