F # ve Scala arasındaki en büyük farklar nelerdir?


59

F # ve Scala, geliştiriciyi yalnızca değişmez veri türlerini kullanmaya zorlamayan işlevsel programlama dilleridir. Her ikisi de nesneleri destekliyor, diğer dillerde yazılmış kütüphaneleri kullanabiliyor ve sanal bir makinede çalışabiliyor. Her iki dilin de ML'ye dayandığı görülüyor.

F # ve Scala arasındaki en büyük farklar nelerdir?


2
Oy kullanıp bunun yararlı bir soru olduğunu düşünebilirseniz veya aşağıda yararlı cevapları varsa, lütfen oy verin. StackExchange sitelerinin iyi bir topluluk oluşturmak için oy kullanması gerekir. Günde 30 oy verebilirsin, boşa harcama. Özellikle yüksek itibar ve oy sayımı düşük olan kullanıcılar lütfen şunu okurlar: meta.programmers.stackexchange.com/questions/393/…
Maniero

functional programming langugages that don't force the developer to only use immutable datatypes- Belki oyuncak dilleri dışında var mı?
Ingo,

1
@Ingo, ML ve Ocaml'ın işlevsel programlama dilleri olarak nitelendirilmediğini düşünüyorsanız, değişkenliğe izin verdiklerinden, belki tanımınızı ayarlamanız gerekir!
Frank Shearar,

3
Frank, yanlış anlamış olmalısın: Yani Haskell'in bile değişken veri türleri var. Dolayısıyla, hala hangi dillerde @ Jaonas'ın belki de sadece değişken veri tiplerini kullanmaya zorlayabileceğini akılda tuttuğunu bilmek istiyorum.
Ingo

Yanıtlar:


61

Başlıca Farklılıklar:

  • Hem Scala hem de F #, OO zorunlu programlama ve işlevsel programlamayı bir dilde birleştirir. Paradigmaların birleşmesine yönelik yaklaşımları yine de çok farklı. Scala çalışır sigorta F # yan iki paradigmalar tarafı temin ise, (bunu nesne fonksiyonlu paradigma olarak adlandırılır) içine bir iki paradigmaları. Örneğin, F # 'daki cebirsel veri tipleri, içerisinde OO'nuz bulunmayan tamamen işlevsel yapılardır, oysa Scala'daki ADT'ler hala normal sınıflar ve nesnelerdir. (Not: CLR bayt kodunun derlenmesi sürecinde, F # ADT'ler bile sınıflar ve nesneler haline gelir ancak kaynak düzeyinde F # programcısı tarafından görülemezler.)

  • F #, tam Hindley-Milner tarzı tip çıkarımına sahiptir. Scala kısmi tür çıkarımı vardır. Subtyping ve saf OO-ness desteği Scala için Hindley-Milner tarzı tipte çıkarımı imkansız kılıyor.

  • Scala, F # 'dan çok daha minimalist bir dildir. Scala, dil boyunca yeniden kullanılan çok küçük bir ortogonal yapı kümesine sahiptir. F #, her küçük şey için yeni bir sözdizimi ortaya koyuyor, böylece Scala'ya kıyasla çok sözdizimi ağırlaşıyor. (Scala'nın 40 anahtar kelimesi vardır, oysa F # 97'dir. Bu size bir şey söylemelidir. :-)

  • Bir Microsoft dili olmak Visual Studio biçiminde mükemmel bir IDE desteğine sahiptir. Scala tarafında işler o kadar iyi değil. Eclipse eklentisi hala işaretin üstünde değil. Aynı NetBeans eklentisi için de geçerli. IDEA, şu anda en iyi bahsiniz gibi gözükse de, Java IDE'ler ile elde ettiğiniz şeye yaklaşamadım bile. (Emacs hayranları için ENSIME var. Bu paket hakkında çok iyi şeyler duydum, ancak henüz denemedim.)

  • Scala, F # 'dan çok daha güçlü (ve karmaşık) tip bir sisteme sahiptir.


Diğer farklılıklar:

  • F # işlevleri varsayılan olarak körüklenir. Scala'da, kurutma kullanılabilir, ancak çok sık kullanılmaz.

  • Scala'nın sözdizimi, Java, Standard ML, Haskell, Erlang ve diğer birçok dilin bir karışımıdır. F # sözdizimi, OCaml, C # ve Haskell'den esinlenmiştir.

  • Scala, daha yüksek tür ve sınıfları destekler. F # değil.

  • Scala, DSL'ler için F # 'dan çok daha uygun.


Not: Hem Scala hem de F # 'yı seviyorum ve gelecekte kendi platformlarının baskın dilleri olduklarını umuyorum. :-)


6
Bu cevap birkaç yanlış anlamaya devam ediyor. Her birini sırayla sıralayacağım. "F # 'daki cebirsel veri tipleri sadece içinde OO'ness olmayan işlevsel yapılardır" demiştir, ancak F #' daki cebirsel veri tipleri sadece sınıflıdır ve özellikle de OO örneği / statik elemanlar ve özelliklerle güçlenmeyi desteklemektedir.
Jon Harrop

7
"Scala iki paradigmayı birle birleştirmeye çalışıyor (buna nesne işlevsel paradigması diyoruz)" diyorsunuz, ancak Scala genel çağrı çağrısı ortadan kaldırmasından ve sonuçta önemsiz olmayan işlev kodundan (sürekli geçiş gibi neredeyse tüm geleneksel işlevsel deyimler dahil) yoksun tarzı ve özyinelemeli düğümü çözme) Scala'da taşmaları istiflemeye eğilimlidir ve bu nedenle pratik olarak işe yaramaz.
Jon Harrop,

4
@JonHarrop: Scala ADT'lere özel olarak davranmıyor. Tıpkı normal sınıflar gibi muamele görürler. Bunların Some(2)arasında Scala’da tipi vardır Some[Int]ve Option[Int]istenmeyen IMO’dur . Diğer diğer taraftan F # ADTS için özel bir sözdizimi ve tedavi vardır ve dolayısıyla doğru türünü çıkarabiliriz Some 2olarak int option. Dolayısıyla ADT'lerin F # kodlaması Scala'nınkinden daha iyidir (tabii ki IMO). Bunun aşağı olduğunu ima etmeye çalışmadım ve bu tarafa rastlarsa özür dilerim.
missingfaktor

9
@JonHarrop: JVM'deki TCO eksikliği birçok Scala geliştiricisini rahatsız etmedi. İnan bana, düşündüğün kadar büyük bir sorun değil. Çoğu zaman, açık bir özyineleme yerine, daha yüksek dereceli fonksiyonlar kullanıyoruz. Ve Scala'daki en yüksek dereceli fonksiyonlar, özyineleme yerine döngüler olarak uygulanır. Bu nedenle, TCO eksikliği önemsiz duruma yaklaşıyor.
missingfaktor

8
Bu sorunun cevabının Scala'ya karşı biraz taraflı olduğunu hissediyorum. Örneğin, Scala, F # ' dan çok daha minimalist bir dildir ve daha karmaşık bir sistemin argümanına / daha sonraki noktasına dayanıyor gibi görünmektedir.
Adam Gent,

9
  • F #, işlevsel yönlere oturtulurken, ölçek, nesne yönelimli yönlere dayanmaktadır.
  • F #, Visual studio ile daha iyi IDE desteğine sahipken, Scala'nın tutulması eklentisi açık kaynaklı IDE için ve nispeten yavaş.
  • Scala'dan daha çok ML benzeri olan F #, OCaml, Standard ML ve Scheme'deki gibi hissetmek için minimal bir lambda hesabına sahiptir. F # oldukça basit bir dil gibi görünüyor.

4
"F # oldukça basit bir dil gibi görünüyor." << Hayır, değil. Scala'dan çok daha büyük. Bir süre bu konuda bir makale yazmalıyım.
15:12 de

4
"Scala nesne yönelimli yönlere dayanıyor." << Yanlış. Scala, OOP AND işlevsel programlamasını birleştirmeye çalışıyor. Ben şahsen çok nadiren nesneye yönelik özelliklerini kullanıyorum. Yaptıklarımızın çoğu tamamen işlevseldir.
15:12 de

@missingfaktor: "Scala'dan çok daha büyük". Dilbilgisi ne kadar büyük?
Jon Harrop,

1
Bir şeylerin değişip değişmediğini bilmiyorum. Eklenti hala açık kaynak ile IntelliJ kayalar Scala.
Colliot

0

Küçük ama önemli noktalardan biri lisanstır: Scala BSD'dir (hemen hemen en fazla izin verilen ücretsiz yazılım lisansıdır), F # "Microsoft Araştırma Paylaşılan Kaynak lisans sözleşmesi" olarak kullanılır, ancak günümüzde ticari bir üründür (aşağıda @Lenzo'ya göre, Ancak hiçbir yerde daha spesifik lisans anlaşmaları bulamadım).


3
Aslında, F # şimdi açık kaynak ve Scala şimdi Martin Odersky'nin şirketi Scala Solutions'ın ticari ürünü.
Jon Harrop

4
@Jon Harrop: Scala Solutions'ın sadece Scala ile ilgili araçlar, hizmetler, eğitim vb. Sattığını düşünüyorum. Dilin kendisi hala BSD lisansı altında görünüyor.
Joonas Pulakka

2
@Joonas: Kesinlikle, aynısı F # için de geçerli.
Jon Harrop

5
@JonHarrop: Scala açık kaynak kalır. Lütfen yanlış bilgileri yaymayın.
missingfaktor

2
@missingfaktor: Scala'nın kapalı kaynak olduğunu söylemedim.
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.