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?
functional programming langugages that don't force the developer to only use immutable datatypes
- czy są jakieś, może poza językami zabawek?Odpowiedzi:
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. :-)
źródło
Some(2)
w Scali ma typ,Some[Int]
a nieOption[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 typieSome 2
asint 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.źródło
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).
źródło