Szukałem w Internecie porównań między F # i Haskellem, ale nie znalazłem niczego naprawdę ostatecznego. Jakie są podstawowe różnice i dlaczego miałbym wybierać jedną z nich?
Szukałem w Internecie porównań między F # i Haskellem, ale nie znalazłem niczego naprawdę ostatecznego. Jakie są podstawowe różnice i dlaczego miałbym wybierać jedną z nich?
Odpowiedzi:
Haskell jest „czystym” językiem funkcjonalnym, w którym F # ma aspekty zarówno języków imperatywnych / obiektowych, jak i funkcjonalnych. Haskell ma również leniwą ocenę, co jest dość rzadkie wśród języków funkcjonalnych.
Co to oznacza? Czysty język funkcjonalny oznacza, że nie ma żadnych skutków ubocznych (lub zmian w stanie współdzielonym, gdy wywoływana jest funkcja), co oznacza, że masz gwarancję, że jeśli wywołasz f (x), nic innego się nie dzieje poza zwróceniem wartości z funkcji, takie jak dane wyjściowe konsoli, dane wyjściowe bazy danych, zmiany zmiennych globalnych lub statycznych ... i chociaż Haskell może mieć nieczyste funkcje (za pośrednictwem monad), musi być „jawnie” implikowane poprzez deklarację.
Czysto funkcjonalne języki i programowanie bez efektów ubocznych zyskały ostatnio popularność, ponieważ dobrze nadają się do współbieżności wielordzeniowej, ponieważ znacznie trudniej jest popełnić błąd bez współdzielonego stanu, niż niezliczone blokady i semafory.
Leniwa ocena ma miejsce, gdy funkcja NIE jest oceniana, dopóki nie jest to absolutnie konieczne. co oznacza, że wielu operacji można uniknąć, gdy nie są one konieczne. Pomyśl o tym w podstawowej C # klauzuli if, takiej jak ta:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
Jeśli IsSomethingTrue()
jest fałszywe, 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 się do programowania poliglotów. Pewnego dnia możesz napisać swój internetowy interfejs użytkownika w ASP.net MVC, logikę biznesową w C #, podstawowe algorytmy w języku F #, a testy jednostkowe w Ironruby ... Wszystko to w ramach .Net.
Posłuchaj radia Software Engineering z Simonem Peytonem Jonesem, aby uzyskać więcej informacji na temat Haskell: Episode 108: Simon Peyton Jones on Functional Programming and Haskell
Duże różnice:
Podobieństwa są ważniejsze niż różnice. Zasadniczo powinieneś używać F #, jeśli jesteś już na .NET, Haskell w przeciwnym razie. Poza tym OO i lenistwo oznaczają, że F # jest bliższy temu, co (prawdopodobnie) już wiesz, więc prawdopodobnie łatwiej się go nauczyć.
Platforma: Haskell ma własne środowisko uruchomieniowe, F # używa .NET. Nie wiem, jaka jest różnica w wydajności, chociaż podejrzewam, że przeciętny kod jest mniej więcej taki sam przed optymalizacją. F # ma tę zaletę, że potrzebujesz bibliotek .NET.
Orientacja obiektowa: 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 typów, które pozwalają ci zrobić coś takiego jak OO, w dziwny sposób. Są jak mixiny Ruby skrzyżowane z funkcjami generycznymi Common Lisp. 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, w rzeczywistości wykonują się szybko. Ale o wiele trudniej jest zgadnąć, jak szybko będzie działać mój kod. Oba języki pozwalają na użycie drugiego modelu, po prostu musisz wyraźnie o tym powiedzieć w swoim kodzie.
Drobne różnice:
F # należy do rodziny języków ML i jest bardzo zbliżony do OCaml. Możesz przeczytać tę dyskusję na temat różnic między Haskell i OCaml .
Główną różnicą, która prawdopodobnie wynika z czystości, ale mniej widzę, o czym wspomniano, jest wszechobecne stosowanie monad. Jak często się podkreśla, monady można budować w większości języków, ale życie zmienia się znacznie, gdy są one powszechnie używane w bibliotekach, a sam ich używasz.
Monady zapewniają coś, co można zobaczyć w innych językach w znacznie bardziej ograniczony sposób: abstrakcję kontroli przepływu. Są niesamowicie przydatne i eleganckie sposoby robienia różnych rzeczy, a rok Haskella całkowicie zmienił sposób, w jaki programuję, w taki sam sposób, w jaki przejście od programowania imperatywnego do programowania obiektowego wiele lat temu zmieniło to, lub znacznie później, używając funkcji wyższego rzędu.
Niestety, w takiej przestrzeni nie ma sposobu, aby zapewnić wystarczające zrozumienie, abyś mógł zobaczyć, 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.
Co więcej, F # czasami może stać się nieco mniej funkcjonalny lub bardziej niezręczny (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 ulepszeń, czy też chcesz poświęcić więcej czasu i uzyskać mniej natychmiastowych korzyści z czegoś większego w długoterminowy. (Lub przynajmniej, jeśli nie dostaniesz czegoś większego, łatwej możliwości szybkiego przełączenia się na drugie?) Jeśli pierwszy, wybierz F #, jeśli drugi, Haskell.
Kilka innych niepowiązanych punktów:
Haskell ma nieco ładniejszą składnię, co nie jest zaskoczeniem, ponieważ projektanci Haskella dość dobrze znali ML. Jednak „lekka” składnia języka F # znacznie przyczynia się do ulepszenia składni ML, więc nie ma tam dużej luki.
Jeśli chodzi o platformy, F # to oczywiście .NET; jak dobrze to zadziała na Mono, nie wiem. GHC kompiluje się do kodu maszynowego z własnym środowiskiem wykonawczym, działającym dobrze zarówno w systemie Windows, jak i Unix, który porównuje się z .NET w taki sam sposób, jak, powiedzmy, C ++. W pewnych okolicznościach może to być zaletą, zwłaszcza jeśli chodzi o szybkość i dostęp do maszyny na niższych poziomach. (Na przykład nie miałem problemu z pisaniem serwera DDE w Haskell / GHC; nie sądzę, abyś mógł to zrobić w jakimkolwiek języku .NET, a mimo to MS z pewnością nie chce, abyś to robił.)
Cóż, powiedziałbym, że główną zaletą jest to, że F # kompiluje się na platformie .NET, co ułatwia wdrażanie w systemie Windows. Widziałem przykłady, które wyjaśniły użycie F # w połączeniu z ASP.NET do tworzenia aplikacji internetowych ;-)
Z drugiej strony Haskell jest w pobliżu już od dłuższego czasu, więc myślę, że grupa ludzi, którzy są prawdziwymi ekspertami w tym języku, jest znacznie większa.
W przypadku języka F # do tej pory widziałem tylko jedną prawdziwą implementację, która jest systemem operacyjnym typu dowód osobliwości. Widziałem więcej implementacji Haskella w świecie rzeczywistym.