Obecnie koduję w C, C ++ i Python. Chcę wybrać funkcjonalny język programowania, a teraz pochylam się w kierunku Haskell. NIE chcę tutaj rozpoczynać wojny „Haskell vs Lisp”; Chcę wiedzieć, co następuje: jeśli nauczę się Haskell przede wszystkim w zakresie programowania funkcjonalnego, jakie korzyści, jeśli w ogóle, uzyskam dzięki późniejszej nauce Lisp?
40
Odpowiedzi:
Proponuję nauczyć się obu, najpierw Haskell, potem Common Lisp. Moje doświadczenie z Haskellem polegało na tym, że pisanie statyczne wydawało się początkowo ograniczającą irytacją, ale kiedy się do tego przyzwyczaiłem, zauważyłem, że za większością błędów mojego typu kryły się błędy logiczne. Gdy dojdziesz do tego punktu i następnego kamienia milowego, którym jest nauczenie się myślenia na temat typów i definiowania własnych typów jako sposobu wyrażenia swojego rozwiązania, będziesz gotowy na Common Lisp.
Dzięki Common Lisp możesz dodawać monady, curry i wszystko, co lubisz od Haskell, ale zyskujesz także wiele dziedziczenia, jak wspomniano Frank Shearar, a także funkcje ogólne z wieloma wysyłkami i zaawansowany system obsługi wyjątków.
Dlaczego więc nie po prostu najpierw nauczyć się Common Lisp? Wywodzę się z tła proceduralnego i OOP. Z mojego doświadczenia wynika, że tak naprawdę nie rozumiałem programowania funkcjonalnego, dopóki nie musiałem go używać wyłącznie. Gdy programowanie funkcjonalne jest wygodne, możesz dodać resztę narzędzi udostępnianych przez Common Lisp i używać dowolnego narzędzia, które jest najlepsze w danym zadaniu.
źródło
I proszę.
Haskell uczy cię najczystszego FP, o ile mi wiadomo, tak jak Smalltalk uczy najczystszego OO. (Wspominam o tym, aby nie sugerować, że OO i FP nie mogą się ożenić, ale ponieważ oba te języki są językami „klejnotowymi” - podstawową ideą doprowadzoną do skrajności.)
Lisp jest naprawdę rodziną języków, więc porozmawiam o Common Lisp, ponieważ jest to konkretny członek rodziny, której używam.
Lisp nadal będzie miał wiele do nauczenia:
źródło
Nauka Lisp później pozwoli ci dostosować Emacsa, który jest prawdopodobnie najbardziej zaawansowanym dostępnym edytorem tekstu. Nie możesz tego zrobić w Haskell.
źródło
Haskell i Lisp to dwie zupełnie różne bestie.
Haskell jest rodzajem „czysto funkcjonalnego programowania w wieży z kości słoniowej”
Lisp jest swego rodzaju „kod-dane-dane / dane-kod-/ twórz własne konstrukcje językowe”. Możesz manipulować kodem w dowolny sposób, jaki możesz sobie wyobrazić.
Są bardzo różne. Oba dzielą aspekt „programowania funkcjonalnego”, ale to naprawdę niewielki wspólny punkt w porównaniu do ich różnic. Po prostu wypróbuj je, a zobaczysz, jak różne są!
źródło
Główną korzyścią, jaką widzę dzięki nauce Lisp, jest nauczenie się, jak zintegrować FP z językiem wieloaradygenowym zorientowanym na rzeczywistość, zamiast uczyć się go tylko w kontekście języka akademickiego, który podkreśla czystość.
źródło
Pochodzę także ze środowisk C / C ++ / Python i kilka razy wypróbowałem FP w ciągu ostatnich kilku lat. Początkowo spojrzałem na Haskella i nie byłem w stanie zrobić z niego głowy ani ogona, potem wypróbowałem Ocaml, ale nie poszedłem dalej. W końcu zacząłem słyszeć dobre rzeczy o Scali, wypróbowałem je i stwierdziłem, że bardzo mi to odpowiadało (w przeszłości również robiłem trochę Java), do tego stopnia, że po roku spędziłem trochę czasu w Scali (i wysłałem 161 Projekt Euler ma z tym problemy), wydaje się, że Haskell ma o wiele więcej sensu. Właśnie zamówiłem kilka książek o Haskell i chcę spróbować jeszcze raz, chociaż jest to w dużej mierze motywowane istnieniem Scalaza.
Uznałem więc, że używanie języka opartego na wielu paradygmatach (tj. Scala, ale Lisp prawdopodobnie również pasuje do tego rachunku) to dobry sposób na FP. Ale jeśli lubisz nurkować w Haskell (nie byłem), idź na całość.
źródło
Początkowo pochodziłem z języka C / C ++ / Ruby i korzystałem z koncepcji FP w Ruby, kiedy tylko mogłem. Stan trochę zranił mój mózg. Jeden z moich kumpli zadzwonił do mnie pewnego dnia i poprosił mnie, abym napisał coś w Haskell (moja pierwsza - i mam nadzieję, że nie ostatnia - praca w Haskell!). Szybko nauczyłem się języka i rzuciłem razem coś, co zadziałało. To nie było piękne ani nic, ale działało.
Zrobiłem miesięczną przerwę od Haskell, ponieważ nie miałem z czego korzystać. Ale kiedy zdecydowałem, że muszę napisać własne oprogramowanie blogowe, skorzystałem z Haskell ( https://symer.io ). Haskell jest naprawdę fajny, ponieważ możesz podzielić problem na części i zaimplementować te części inaczej w zależności od danych wejściowych. Haskell bardzo dobrze radzi sobie również z awariami dzięki inteligentnemu zestawianiu wartości. Jest tak wiele narzędzi do pracy z tymi skrzynkami, że po prostu zapominasz, że istnieją.
Moje doświadczenia z seplenieniem (Schemat) były całkowicie negatywne. Językowi brakowało nie tylko tych inteligentnych, prostych narzędzi, ale także niebezpiecznie luźnych jak Ruby czy JavaScript. To było okropne doświadczenie i nie oferuje nic nowego poza Ruby lub Python.
C ++ nie może trzymać świeczki przed Haskellem poza zarządzaniem pamięcią. Haskell jest równie szybki (jeśli nie szybszy), znacznie bardziej zwięzły i znacznie bezpieczniejszy. Ale bezpieczeństwo Haskella nigdy nie przeszkadza.
TL; TR Haskell to powiew świeżego powietrza, a Lisp to nieco bardziej funkcjonalny Ruby.
źródło