Jakie są największe różnice między F # a Scalą?

59

Zarówno F #, jak i Scala są funkcjonalnymi językami programowania, które nie zmuszają programisty do używania tylko niezmiennych typów danych. Oba mają obsługę obiektów, mogą korzystać z bibliotek napisanych w innych językach i działać na maszynie wirtualnej. Wydaje się, że oba języki oparte są na ML.

Jakie są największe różnice między F # a Scalą, mimo że F # jest przeznaczony dla platformy .NET i Scala dla platformy Java?

Jonas
źródło
2
Jeśli możesz głosować i uważasz, że jest to przydatne pytanie lub poniżej znajdziesz przydatne odpowiedzi, zagłosuj. Witryny StackExchange potrzebują głosów, aby zbudować dobrą społeczność. Możesz dać 30 głosów dziennie, nie marnuj ich. Specjalnie użytkownicy z wysoką renomę i niskich liczenia głosów podane proszę przeczytać: meta.programmers.stackexchange.com/questions/393/...
Maniero
functional programming langugages that don't force the developer to only use immutable datatypes- czy są jakieś, może poza językami zabawek?
Ingo,
1
@ Ingo, jeśli uważasz, że ML i Ocaml nie kwalifikują się jako funkcjonalne języki programowania, ponieważ umożliwiają modyfikację, być może powinieneś dostosować swoją definicję!
Frank Shearar
3
+ Frank, musiałeś źle zrozumieć: To znaczy, nawet Haskell ma zmienne typy danych. Dlatego nadal chciałbym wiedzieć, jakie języki @ Jonas ma na myśli, co zmusiłoby nas do używania tylko niezmiennych typów danych?
Ingo

Odpowiedzi:

61

Główne różnice:

  • Zarówno Scala, jak i F # łączą programowanie OO-imperatywne i programowanie funkcjonalne w jednym języku. Ich podejście do unifikacji paradygmatów jest jednak zupełnie inne. Scala próbuje fuzji dwóch paradygmatów w jeden (nazywamy to obiekt funkcjonalny paradygmatu), natomiast F # zapewnia bok dwa paradygmaty siebie. Na przykład algebraiczne typy danych w F # są czysto funkcjonalnymi konstrukcjami bez OO'ness, podczas gdy ADT w Scali są nadal regularnymi klasami i obiektami. (Uwaga: w procesie kompilacji do kodu bajtowego CLR nawet AD # FT stają się klasami i obiektami, ale nie są widoczne dla programisty F # na poziomie źródła.)

  • F # ma pełne wnioskowanie o stylu Hindley-Milner. Scala ma częściowe wnioskowanie o typie. Obsługa podtypów i czystego OO uniemożliwia wnioskowanie o stylu Hindley-Milnera dla Scali.

  • Scala jest znacznie bardziej minimalistycznym językiem niż F #. Scala ma bardzo mały zestaw ortogonalnych konstrukcji, które są ponownie używane w całym języku. F # wydaje się wprowadzać nową składnię dla każdego drobiazgu, przez co staje się bardzo ciężki pod względem składni w porównaniu ze Scalą. (Scala ma 40 słów kluczowych, podczas gdy F # ma 97. To powinno ci coś powiedzieć. :-)

  • F # będąc językiem Microsoft ma doskonałą obsługę IDE w postaci Visual Studio. Po stronie Scali nie jest tak dobrze. Wtyczka Eclipse wciąż nie jest do góry nogami. To samo dotyczy wtyczki NetBeans. IDEA wydaje się w tej chwili najlepszym rozwiązaniem, choć nawet nie zbliża się do tego, co można uzyskać dzięki IDE Java. (Dla fanów Emacsa jest ENSIME. Słyszałem wiele dobrych rzeczy o tym pakiecie, ale jeszcze go nie próbowałem.)

  • Scala ma znacznie potężniejszy (i złożony) system typów niż F #.


Inne różnice:

  • Funkcje F # są domyślnie curry. W Scali curry jest dostępne, ale nie jest używane zbyt często.

  • Składnia Scali jest mieszanką Java, Standard ML, Haskell, Erlang i wielu innych języków. Składnia F # jest inspirowana przez OCaml, C # i Haskell.

  • Scala obsługuje wyższe rodzaje i klasy. F # nie.

  • Scala jest znacznie bardziej podatna na DSL niż F #.


PS: Uwielbiam zarówno Scalę, jak i F # i mam nadzieję, że w przyszłości staną się dominującymi językami swoich platform. :-)

missingfaktor
źródło
6
Ta odpowiedź utrwala kilka nieporozumień. Wymienię je kolejno. Powiedziałeś, że „algebraiczne typy danych w F # są czysto funkcjonalnymi konstrukcjami bez OO'ness”, ale algebraiczne typy danych w F # są tylko klasami, a w szczególności wspierają one rozszerzanie o elementy OO / elementy statyczne i właściwości.
Jon Harrop,
7
Mówisz, że „Scala próbuje połączyć dwa paradygmaty w jeden (nazywamy to paradygmatem funkcjonalno-obiektowym)”, ale Scali brakuje ogólnej eliminacji wywołania ogona, aw konsekwencji żadnego nietrywialnego kodu funkcjonalnego (w tym prawie wszystkich konwencjonalnych idiomów funkcjonalnych, takich jak przekazywanie kontynuacji styl i rozwiązywanie węzła rekurencyjnego) są podatne na przepełnienie stosu w Scali, a zatem są praktycznie bezużyteczne.
Jon Harrop,
4
@JonHarrop: Scala nie traktuje specjalnie ADT. Są traktowane jak zwykłe zajęcia. Z tego Some(2)w Scali ma typ, Some[Int]a nie Option[Int]co jest niepożądane IMO. Z drugiej strony F # ma specjalną składnię i leczenie dla ADT, a zatem może poprawnie wnioskować o typie Some 2as int option. Tak więc kodowanie F # ADT jest lepsze niż kodowanie Scali (oczywiście IMO). Nie próbowałem sugerować, że jest gorszy i przepraszam, że tak się stało.
missingfaktor
9
@JonHarrop: Brak TCO w JVM nie przeszkadzał wielu programistom Scala. Zaufaj mi, nie jest to tak duży problem, jak się wydaje. Przez większość czasu używamy funkcji wyższego rzędu zamiast jawnej rekurencji. I większość funkcji wyższego rzędu w Scali jest zaimplementowana w kategoriach pętli, a nie rekurencji. Tak więc brak TCO staje się prawie nieistotny.
missingfaktor
8
Wydaje mi się, że cała ta odpowiedź jest nieco stronnicza w stosunku do Scali. Na przykład Scala jest znacznie bardziej minimalistycznym językiem niż F #, co wydaje się sprzeczne z jego argumentem / późniejszym punktem bardziej złożonego systemu typów.
Adam Gent
9
  • F # opiera się na aspektach funkcjonalnych, podczas gdy scala opiera się na aspektach obiektowych.
  • F # ma lepszą obsługę IDE w Visual Studio, podczas gdy wtyczka Scala do zaćmienia środowiska IDE jest otwarta i jest stosunkowo wolniejsza.
  • F #, bardziej podobny do ML niż Scala, ma więcej minimalnego rachunku lambda - tak jak OCaml, Standard ML i Schemat. F # wydaje się być znacznie prostszym językiem.
Ayush Goyal
źródło
4
„F # wydaje się być znacznie prostszym językiem”. << Nie, nie jest. Jest znacznie większy niż Scala. Powinienem kiedyś napisać artykuł na ten temat.
missingfaktor
4
„Scala opiera się na aspektach obiektowych”. << Źle. Scala próbuje połączyć OOP ORAZ programowanie funkcjonalne. Osobiście bardzo rzadko korzystam z funkcji obiektowych. Większość tego, co robimy, jest czysto funkcjonalna.
missingfaktor
@missingfaktor: „Jest znacznie większy niż Scala”. Jak duże są gramatyki?
Jon Harrop
1
Nie wiem czy coś się zmieniło. Scala w skałach IntelliJ, z wtyczką wciąż open source.
Colliot,
0

Jedną małą, ale ważną kwestią jest licencja: Scala to BSD (prawie najbardziej dopuszczalna licencja wolnego oprogramowania), F # była kiedyś „umową licencyjną Microsoft Research Shared Source”, ale obecnie jest produktem komercyjnym (zgodnie z poniższym @ Lorenzo, chociaż nigdzie nie mogłem znaleźć bardziej szczegółowych umów licencyjnych).

Joonas Pulakka
źródło
3
W rzeczywistości F # jest teraz oprogramowaniem typu open source, a Scala jest teraz produktem handlowym firmy Scala Solutions Martina Oderskiego.
Jon Harrop,
4
@Jon Harrop: Myślę, że Scala Solutions sprzedaje tylko narzędzia, usługi, szkolenia itp. Związane z Scalą. Sam język nadal wydaje się być objęty licencją BSD.
Joonas Pulakka
2
@Joonas: Dokładnie to samo dotyczy F #.
Jon Harrop,
5
@JonHarrop: Scala pozostaje open source. Proszę nie rozpowszechniać dezinformacji.
missingfaktor
2
@missingfaktor: Nie powiedziałem, że Scala jest zamkniętym źródłem.
Jon Harrop