Patrzę na nurkowanie w Haskell dla mojego następnego (stosunkowo trywialnego) osobistego projektu. Powody, dla których walczę z Haskellem są:
- Przejdź na język funkcjonalny
- Prędkość. Chociaż jestem pewien, że można to argumentować, profilowanie, które widziałem, gwoździe Haskell blisko C ++ (i wydaje się być nieco szybsze niż Erlang).
- Prędkość. Serwer internetowy Warp wydaje się być szalony szybki w porównaniu do praktycznie wszystkiego innego .
Biorąc to pod uwagę, szukam wad i problemów związanych z Haskellem. Sieć ma ogromną ilość informacji o tym, dlaczego Haskell jest dobrą rzeczą, ale nie znalazłem wielu tematów na temat jej brzydkiej strony (poza chwytami związanymi z jej składnią, o które w ogóle nie dbam).
Przykładem tego, czego szukam, może być GIL Pythona. Coś, co nie pochyliło się, dopóki naprawdę nie zacząłem używać współbieżności w środowisku CPython.
Odpowiedzi:
Kilka wad, o których mogę myśleć:
źródło
Większość wad Haskell (jak również większość zalet Haskell) wynika z dwóch charakterystycznych cech: jest leniwy i czysto funkcjonalny.
Leniwość sprawia, że trudniej jest uzasadnić wydajność. Zwłaszcza dla osób nieprzyzwyczajonych do lenistwa, ale nawet doświadczonym Haskellerom może być trudno dostrzec, jak lenistwo wpłynie na wydajność w niektórych przypadkach.
Lenistwo oznacza również, że trudniej jest tworzyć dokładne testy porównawcze bez korzystania z bibliotek takich jak Criterion.
Bycie czysto funkcjonalnym oznacza, że za każdym razem, gdy potrzebujesz użyć zmiennych struktur danych (w przypadkach, w których nie można osiągnąć pożądanej wydajności bez nich - chociaż dzięki optymalizatorowi GHC, który nie zdarza się tak często, jak myślisz), będziesz utknął w monadzie IO (lub ST), co czyni kod bardziej kłopotliwym.
Ponieważ wymieniłeś prędkość jako jeden ze swoich celów, powinienem zauważyć, że często istnieją ogromne różnice w wydajności między ręcznie zoptymalizowanym kodem Haskell a kodem Haskell, który został napisany bez większego zastanowienia się nad wydajnością (bardziej niż w innych językach). A ręcznie zoptymalizowany kod Haskell jest często dość brzydki (choć przypuszczam, że dotyczy to również większości innych języków).
źródło
Nie jestem ekspertem od Haskell: nauczyłem się podstaw, ale niestety nie miałem okazji zrobić poważnego projektu w Haskell (chciałbym, bo bardzo lubię ten język).
Jednak z tego, co wiem i z dyskusji z kimś, kto pracował w dziedzinie dość bliskiej programowaniu funkcjonalnemu, Haskell może nie być najlepszym rozwiązaniem, jeśli chcesz wdrożyć algorytmy grafów, w których musisz np. Przejść przez wykres i wykonać wiele lokalnych zmian w strukturze wykresu.
Ponieważ wykres nie ma ogólnie struktury rekurencyjnej, uważam, że najlepszym podejściem jest zbudowanie jednej kopii wykresu przy użyciu struktur i wskaźników między nimi (jak można to zrobić np. W C ++) i manipulowanie tą kopią poprzez zmianę wskaźników, tworzenie lub niszczenie węzłów i tak dalej.
Zastanawiam się, jak takie struktury danych i operacje mogą być właściwie obsługiwane w Haskell, ponieważ o ile wiem w Haskell, nie jest możliwe użycie powyższej reprezentacji / podejścia. W tym artykule krótko omówiono niektóre problemy z algorytmami graficznymi w Haskell
EDYTOWAĆ
Niedawno rozmawiałem z ekspertem od programowania funkcjonalnego i potwierdził on, że wydajne wdrażanie niektórych algorytmów graficznych może być dość trudne w Haskell: poruszanie się po wskaźnikach, takich jak w C lub C ++, może być znacznie szybsze.
źródło
Wadą Haskell jest to, że jest inaczej. Jest to większy krok od języków, których częściej się uczy lub mówi, więc będzie większa krzywa uczenia się. Jest również mniej popularny w języku, który może ograniczyć dostępność pomocy, jeśli utkniesz. To naprawdę nie są poważne wady.
Jedyną potencjalną wadą jest to, że jest to język funkcjonalny, więc jest mniej przydatny w niektórych domenach problemowych, ale dotyczy to również języków obiektowych. Ogólnie języki nie mają prawdziwych negatywów wykraczających poza krzywe uczenia się, przynajmniej w przypadku stosunkowo popularnych języków. Tak długo, jak język jest kompletny, jest teoretycznie zdolny do wszystkiego.
źródło
„Problemy z Haskellem” zwykle pojawiają się w niektórych domenach. Haskell to wspaniały język do programowania aplikacji, znacznie przyjemniejszy w pisaniu niż cokolwiek innego. Problemy zwykle pojawiają się, gdy próbujesz zrobić coś, na co nie ma dobrego wsparcia, na przykład:
źródło