Jakie są podstawowe różnice między Haskell i F#? [zamknięte]

zamknięte . To pytanie musi być bardziej skoncentrowane . Obecnie nie przyjmuje odpowiedzi. Zamknięty 6 lat temu . zamknięty. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Szukałem w Internecie porównań między F # i Haskell ale nie znalazłem niczego naprawdę definitywnego. Jakie są podstawowe różnice i Dlaczego chciałbym wybrać jeden nad drugim?

Author: nicael, 2008-09-04

5 answers

Haskell jest "czystym" językiem funkcyjnym, gdzie jako F # ma aspekty zarówno imperatywnych / oo, jak i funkcyjnych języków. Haskell ma również leniwe oceny, co jest dość rzadkie wśród języków funkcyjnych.

Co to znaczy? Czysty język funkcjonalny, oznacza, że nie ma żadnych skutków ubocznych (lub zmian w stanie współdzielonym, gdy funkcja jest wywoływana), co oznacza, że masz gwarancję, że jeśli wywołasz f (x), nic innego się nie dzieje poza zwróceniem wartości z funkcji, takich jak wyjście konsoli, wyjście bazy danych, zmiany zmiennych globalnych lub statycznych.. i chociaż Haskell może mieć funkcje nie czyste (poprzez monady), to musi być "jawnie" implikowane poprzez deklarację.

Pure functional languages and 'No side effect' programming zyskał ostatnio popularność, ponieważ dobrze nadaje się do wielordzeniowej współbieżności, ponieważ znacznie trudniej jest pomylić się z brakiem współdzielonego stanu, a nie z niezliczonymi blokadami i semaforami.

Leniwa ocena jest tam, gdzie funkcja nie jest ocenione, dopóki nie jest to absolutnie konieczne wymagane. oznacza to, że wiele operacji można uniknąć, gdy nie jest to konieczne. Pomyśl o tym w podstawowej klauzuli C # if, takiej jak Ta:

if(IsSomethingTrue() && AnotherThingTrue())
{
    do something;
}

Jeśli IsSomethingTrue() jest false, to AnotherThingTrue() metoda nigdy nie jest oceniana.

Chociaż Haskell jest niesamowitym językiem, główną zaletą F# (na razie) jest to, że znajduje się on na szczycie CLR. To nadaje mu samo programowanie poligloty. Pewnego dnia możesz napisać swój web UI w ASP.net MVC, twoja logika biznesowa w C#, twoja podstawowe algorytmy w F# i testy jednostkowe w Ironruby.... Wszystko wśród. Net framework. Odcinek 108: Simon Peyton Jones o programowaniu funkcyjnym i Haskell Odcinek 108: Simon Peyton Jones o programowaniu funkcyjnym i Haskell odcinek 108: Simon Peyton Jones o programowaniu funkcyjnym i Haskell odcinek 108: Simon Peyton Jones o programowaniu funkcyjnym]}
 128
Author: Xian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 14:32:01

Duże różnice:

  • Platforma
  • orientacja obiektu
  • lenistwo

Podobieństwa są ważniejsze niż różnice. Zasadniczo, należy użyć F#, jeśli jesteś na. Net już, Haskell inaczej. Ponadto OO i lenistwo oznaczają, że F# jest bliższe temu, co (prawdopodobnie) już wiesz, więc prawdopodobnie łatwiej się tego nauczyć.

Platforma: Haskell ma swój własny runtime, F # używa. NET. Nie wiem jaka jest różnica w wydajności, chociaż podejrzewam średni kod jest mniej więcej taki sam przed optymalizacją. F # ma tę zaletę, jeśli potrzebujesz bibliotek. NET.

Orientacja obiektu: F # ma OO, i jest bardzo ostrożny, aby upewnić się, że klasy.NET są łatwe w użyciu, nawet jeśli twój kod nie jest oo. Haskell ma klasy typu, które pozwalają zrobić coś takiego jak OO, w dziwny sposób. Są jak Ruby mixins skrzyżowane z Common Lisp generic functions. Są trochę jak Interfejsy Java / C#.

Lenistwo: Haskell jest leniwy, F# nie. Lenistwo umożliwia kilka fajnych sztuczek i sprawia, że niektóre rzeczy, które wyglądają na wolne, faktycznie wykonują się szybko. Ale trudniej mi zgadnąć, jak szybko będzie działał mój kod. Oba języki pozwalają na użycie innego modelu, po prostu musisz być o tym wyraźnie w swoim kodzie.

Drobne różnice:

  • składnia: Haskell ma moim zdaniem nieco ładniejszą składnię. Jest trochę bardziej zwięzły i regularny, a ja lubię deklarować typy na osobnej linii. YMMV.
  • Narzędzia: F # ma doskonałe Visual Studio integracja, jeśli lubisz takie rzeczy. Haskell ma również starszą wtyczkę Visual Studio , ale nie sądzę, aby kiedykolwiek wyszedł z beta. Haskell ma prosty tryb Emacsa i możesz prawdopodobnie użyć trybu Tuareg Ocamla do edycji F#.
  • efekty uboczne : oba języki sprawiają, że jest to dość oczywiste, gdy ty mutujesz zmienne. Ale kompilator Haskella zmusza cię również do oznaczania efektów ubocznych za każdym razem, gdy ich używasz. Praktyczna różnica polega na tym, że musisz być dużo bardziej świadomy, kiedy używasz bibliotek z efektami ubocznymi.
 53
Author: Nathan Shively-Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:33:20

F # jest częścią rodziny języków ML i jest bardzo blisko OCaml. Możesz przeczytać tę dyskusję na temat różnic między Haskell i OCaml.

 35
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 00:22:54

Zasadniczą różnicą, która jest prawdopodobnie wynikiem czystości, ale mniej widzę, jest wszechobecne użycie monad. Jak często wskazuje się, monady mogą być budowane w większości dowolnego języka, ale życie zmienia się znacznie, gdy są używane wszechobecnie w bibliotekach, a ty sam z nich korzystasz.

Monady dostarczają czegoś postrzeganego w znacznie bardziej ograniczony sposób w innych językach: abstrakcji kontroli przepływu. Są niezwykle przydatne i eleganckie sposoby robienia różnego rodzaju rzeczy, a rok Haskella całkowicie zmienił sposób, w jaki programuję, w taki sam sposób, w jaki wiele lat temu zmieniło to przejście od programowania imperatywnego do programowania OO, lub znacznie później, używając funkcji wyższego rzędu.

Niestety, nie ma sposobu w takiej przestrzeni, aby zapewnić wystarczająco dużo zrozumienia, aby pokazać, jaka jest różnica. W rzeczywistości żadna ilość pisania tego nie zrobi; po prostu musisz poświęcić wystarczająco dużo czasu na naukę i pisanie kodu, aby uzyskać prawdziwe zrozumienie.

Jak również F# czasami może stać się nieco mniej funkcjonalny lub bardziej niewygodny (z punktu widzenia programowania funkcjonalnego), gdy łączysz się z platformą/bibliotekami.NET, ponieważ biblioteki zostały oczywiście zaprojektowane z punktu widzenia OO.

Więc możesz rozważyć swoją decyzję w ten sposób: czy chcesz wypróbować jeden z tych języków, aby uzyskać szybki, stosunkowo niewielki przyrost poprawy, czy też jesteś gotów poświęcić więcej czasu i uzyskać mniej natychmiastowych korzyści dla czegoś większego w na dłuższą metę. (A przynajmniej, jeśli nie masz czegoś większego, łatwą możliwość szybkiego przełączania się na drugi?) Jeśli pierwszy, F # jest twoim wyborem, jeśli drugi, Haskell.

Kilka innych niepowiązanych punktów:

Haskell ma nieco ładniejszą składnię, co nie jest zaskoczeniem, ponieważ projektanci Haskell znali ML dość dobrze. Jednak składnia F # 'S' light ' idzie długą drogę w kierunku poprawy składni ML, więc nie ma tam wielkiej luki.

Jeśli chodzi o platformy, F # jest oczywiście . NET; jak dobrze to zadziała na Mono Nie wiem. GHC kompiluje do kodu maszynowego z własnym środowiskiem wykonawczym, działa dobrze zarówno pod Windows, jak i Unix, który porównuje się do. Net w taki sam sposób, jak np. C++. W niektórych okolicznościach może to być zaletą, zwłaszcza pod względem prędkości i dostępu do maszyny niższego poziomu. (Nie miałem problemu z napisaniem serwera DDE na przykład w Haskell/GHC; nie sądzę, że można to zrobić w każdym języku. NET, a mimo to MS na pewno nie chce, żebyś robił to.)

 33
Author: cjs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-28 16:03:06

Cóż, po pierwsze, powiedziałbym, że główną zaletą jest to, że F# kompiluje się na platformie. NET, co ułatwia wdrożenie na windows. Widziałem przykłady, które wyjaśniono za pomocą F# w połączeniu z ASP.NET do budowy aplikacji internetowych; -)

Z drugiej strony, Haskell jest już waaaaay dłużej, więc myślę, że grupa ludzi, którzy są prawdziwymi ekspertami w tym języku jest o wiele większa.

Dla F# do tej pory widziałem tylko jedną rzeczywistą implementację, czyli osobliwość proof of concept OS. Widziałem więcej realnych implementacji Haskella.

 2
Author: Erik van Brakel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-04 23:28:05