Jakie są zalety korzystania z LISP i Haskell? Czy uczynią mnie lepszym programistą? [Zamknięte]

41

Wiem, że Lisp i Haskell są odpowiednio logicznymi i funkcjonalnymi językami programowania, ale co to właściwie znaczy? Czym różnią się od innych języków? Słyszałem, że nauczenie się tych sprawi, że będziesz lepszym programistą i poprawisz swoją logikę. Czy to prawda i jeśli pójdę uczyć się Lisp lub Haskell na kompetentnym poziomie, moje programowanie ulegnie poprawie i czy będę w stanie lepiej radzić sobie z jakimkolwiek problemem w dowolnym języku? Chciałem tylko wiedzieć, czy warto je uczyć. Czy te języki są również przydatne w takich obszarach, jak GUI i grafika, czy są one przydatne w aplikacjach konsolowych?

Logan545
źródło
36
Korzystanie z LISP i Haskell sprawi, że będziesz lepszym programistą LISP i Haskell, gwarantuję to.
Neil
17
@MasonWheeler Muszę powiedzieć; w systemie typów Haskell jest wiele elementów, których nie znajdziesz w żadnym innym języku, a makr LISP nigdzie nie można znaleźć w żadnym głównym języku. Obie te rzeczy są warte uczenia się, ponieważ nie sprawi, że lepiej programista w języku roboczym. Przynajmniej takie było moje doświadczenie; Haskell uczynił mnie lepszym przedsiębiorczym programistą C #. Znam techniki czystego wdrażania separacji problemów, których inaczej bym nigdy nie miał, a rozwiązywanie problemów na zawsze będzie dla mnie o wiele prostsze niż wcześniej, zanim nauczyłem się Haskella.
Jimmy Hoffa
6
Erlang jest językiem funkcjonalnym. Rabbit MQ jest napisany w Erlang, a Rabbit jest używany w wielu miejscach, aby wykonać wiele krytycznych ciężkich zadań. Języki funkcjonalne uczą odmiennego myślenia o programowaniu, a jest to miłe dodatkowe narzędzie do dyspozycji. Chociaż prawdą jest, że niektóre z tych pojęć stały się popularnymi językami (np. Wyrażenia lambda w C # i C ++), nadal rozwiązujesz problemy w zupełnie inny sposób, używając języka funkcjonalnego.
Binary Worrier
8
@MasonWheeler Istnieją całkiem dobre powody, dla których język może być bardziej przydatny niż reszta, ale nadal nie jest powszechnie używany. Mogę myśleć o wielu: istniejącej bazie użytkowników, zbyt radykalnej zmianie, kiedy „dobre jest wystarczająco dobre”, a także… kiedy lepsze narzędzie wymaga programistów, którzy są bardziej formalnie przeszkoleni. Więc popularność nie jest dobrą miarą przydatności .
Andres F.
5
@MasonWheeler Aby użyć analogii, matematyka jest niezwykle przydatną dziedziną w prawdziwym życiu. Dlaczego więc więcej osób nie ma biegłości w matematyce? Dlaczego wielu ludzi się tego boi i uważa, że ​​to czarna magia i nie jest aż tak przydatna?
Andres F.

Odpowiedzi:

37

To bardzo przypomina naukę matematyki, która poprawi umiejętności analityczne, a nauka literatury łacińskiej / klasycznej poprawi umiejętności pisania.

Ludzie, którzy zaprojektowali te języki, intensywnie zastanawiali się, co oznacza pisanie programu. Te języki to wyniki tych badań.

To powiedziawszy, nauka języka Java sprawi, że będziesz lepszym programistą. I nauka C. Rzeczywiste korzyści płyną z nauki języków o innej filozofii. Następnie możesz mieć własną opinię o sposobie pisania programu.

Edytować

Zdaję sobie sprawę, że ta odpowiedź nie jest tak przydatna dla osób, które jeszcze nie nauczyły się haskell i / lub seplenienia. Oto kilka przykładów, aby wyjaśnić, co mam na myśli

SEPLENIENIE

Lisp uważa, że ​​składnia powinna być minimalna i że wszystko powinno być albo listą, albo prymitywem (Lisp oznacza List Processing). Nawet programy to głównie listy zawierające inne listy i symbole. Lisp pozwala manipulować programami jako listą i generować nowe programy w locie. Stąd całe code is data and data is codemotto.

Bezpośrednią konsekwencją jest to, że języki Lisp umożliwiają zdefiniowanie dowolnego interfejsu. Dobrym przykładem jest compojure, który jest strukturą internetową clojure. Oto jak wygląda funkcja routingu

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Innym dobrym przykładem jest szkielet szablonów czkawki:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Jak widać, wynik jest tak zwięzły jak w DSL jak wąsy, ale umożliwia korzystanie z funkcji językowych, takich jak (for [x (range 1 4)] block). Jeszcze ładniejsze, masz wszystkie narzędzia do abstrakcyjnego i uporządkowania kodu.

W innych językach składnia jest bardziej złożona. Nie można odczytać programu Java jako zbioru list. Ale używając Lisp, masz lepsze pojęcie o tym, jak powinien wyglądać idealny interfejs i co w twoim kodzie można wyodrębnić jako dane. Pomaga także zobaczyć twój ulubiony język jako strukturę dużych zbiorów danych i lepiej zrozumieć jego semantykę.

Haskell

Haskell wierzy w silne pisanie statyczne i czystość. Czyste funkcje są jak funkcje matematyczne: są zdefiniowane na zbiorze wartości i odwzorowane na innym zbiorze. Funkcja nie ma skutków ubocznych, a wartości są niezmienne. Czystość jest interesująca, ponieważ nie jest to coś, co może posiadać język wieloparadygmatyczny. Język jest czysty lub nie.

Jedną konsekwencją jest to, że nie możesz wykonać akcji IO, kiedy chcesz (haskellers uważa, że ​​to dobra rzecz). Działania IO są definiowane jako transakcje, które same w sobie są czystymi wartościami. mainWartość programu Haskell jest transakcją IO wykonywane podczas uruchamiania programu.

Musisz wyraźnie poradzić sobie z przepływem danych w swoim programie. Nie można nawiązać komunikacji między dwoma komponentami poprzez zapisywanie i odczytywanie rzeczy w zmiennej globalnej. Musisz budować i przekazywać wartości.

Kolejną cechą wspomnianą przez Jimmy'ego Hoffę jest bogaty system typów. Podczas gdy inne języki mają pisanie statyczne, w haskell możesz mieć takie rzeczy jak:

length :: [a] -> Int (funkcja z listy a do int)

map :: (a -> b) -> [a] -> [b](funkcja, która pobiera a to btransformację i listę a, i zwraca listę b)

Fajną rzeczą jest to, że nie muszę wyjaśniać, co właściwie robią te funkcje: już rozumiesz ich zachowanie. Co więcej, funkcje z tymi podpisami nie mogą tak naprawdę obliczyć długości listy i odwzorować transformację na liście.

W innych językach pisanych hierarchie klas w połączeniu ze zmiennością sprawiają, że radzenie sobie z tymi typami jest koszmarem. Musisz zrozumieć takie rzeczy jak kowariancja i kontrawariancja, których nie da się uzyskać z perspektywy językowej (tj. Proste, mocne i bezpieczne).

Albo pójdziesz bezpieczną ścieżką (jak scala) i skończysz na naprawdę złożonym języku, albo pójdziesz prostą ścieżką i dostaniesz coś, co jest albo ograniczone (google go generics ogranicza się do listy i map), albo niebezpieczne (dart generics, które zawsze są kowariant).

Korzystając z haskell, uczysz się głównie o korzyściach płynących z czystości oraz o tym, jak pisać czysty kod.

Simon Bergot
źródło
1
@ JimmyHoffa Myślę, że tak naprawdę zasługuje na swoją własną odpowiedź, ponieważ ludzie często to przeoczają. Istnieją dziedziny problemów, które najlepiej rozwiązać za pomocą programowania funkcjonalnego, o których ludzie nawet nie wiedzą, że istnieją, dopóki przynajmniej nie zajmą się tymi domenami poza swoją strefą komfortu.
KChaloux
2
Nie wiem o Zgromadzeniu i też o nim nie wspominałem. Jednak montaż może pomóc ci zrozumieć, jak działają twoje programy. Jest świetny post na SO, który jest w stanie przeanalizować wygenerowany zestaw w celu wyjaśnienia problemu z wydajnością.
Simon Bergot
3
@KChaloux Chciałbym napisać odpowiedź, ale to pytanie powinno zostać zamknięte (odpowiednio głosowałem). Mówiąc najprościej, mógłbym napisać swoją opinię i doświadczenie w odpowiedzi, ale nie byłoby to ani lepsze, ani złe niż inne odpowiedzi, na tym polega problem z zaleceniami językowymi i dlaczego głosowałem za zamknięciem.
Jimmy Hoffa,
7
OMG, @Neil wiedza na temat tego, co robi komputer, na pewno sprawi, że będziesz lepszym programistą. Od lat nie pisałem asemblera, ale regularnie go czytam (na wielu platformach), a jeśli zależy ci na tym, jak naprawdę działa twój program, bardzo ważne jest, aby znać przynajmniej podstawy.
dash-tom-bang
3
@Neil, w jakim przypadku bycie gorszym programistą jest zaletą? Co sprawia, że ​​przywołujesz kod spaghetti? Co kod spaghetti ma wspólnego z asemblerem lub z byciem dobrym programistą, z wyjątkiem fantazji o nie znaniu asemblera i konieczności racjonalizacji, aby uniknąć nauki? Bycie dobrym koderem asemblerowym bardzo dobrze zdaje sobie sprawę ze złych praktyk kodowania.
dash-tom-bang
12

tl; dr Uczenie się nowych rzeczy może uczynić cię lepszym programistą, ale bycie lepszym programistą nie polega na językach, w których możesz pisać kod.

Jakie są zalety korzystania z LISP i Haskell?

SEPLENIENIE:

  1. Kod homoonic. Pozwala to na ustrukturyzowany kod samomodyfikujący.
  2. Makra obsługujące składnię. Pozwalają na przepisywanie kodu płyty grzewczej.
  3. Pragmatyzm. CL został zaprojektowany do wykonywania zadań przez pracujących profesjonalistów. Większość języków funkcjonalnych z reguły nie jest.
  4. Elastyczność. Może robić wiele różnych rzeczy, wszystko z rozsądną prędkością.
  5. Wartowność Prawdziwy świat jest brudny. Kodowanie pragmatyczne kończy się na wykorzystaniu lub wynalezieniu niechlujnych konstrukcji. Common Lisp ma wystarczającą czujność, że może załatwić sprawę.

Prawdopodobnie jedynym prawdziwym powodem wyboru przeciwko CL jest to, że standardowe biblioteki są datowane.

Wyjdę na całość i powiem, że w ogólnym przypadku składnia nie powinna stanowić problemu dla profesjonalnego pracownika oprogramowania.

Od: Dlaczego Lisp jest przydatny?

Haskell:

Haskell jest językiem programowania komputerowego. W szczególności jest to polimorficznie statycznie typowany, leniwy, czysto funkcjonalny język, zupełnie odmienny od większości innych języków programowania. Nazwa języka pochodzi od Haskell Brooks Curry, którego praca w logice matematycznej służy jako podstawa dla języków funkcjonalnych. Haskell opiera się na rachunku lambda, stąd lambda używamy jako logo.

Możesz tam przeczytać opis Funkcjonalny vs imperatyw

Od: http://www.haskell.org/haskellwiki/Introduction

Czy uczynią mnie lepszym programistą?

Tak, oczywiście, znajomość większej liczby języków i paradygmatów może tylko uczynić cię lepszym programistą, ale zrozum to:

Nie ma ani jednego narzędzia, ani jednej książki, ani jednego paradygmatu programistycznego, który uczyni cię lepszym programistą.

Uczenie się różnych języków programowania z różnymi paradygmatami zdecydowanie pomaga ci być lepszym programistą, nauka rozwiązywania problemów z różnymi podejściami również znacznie poprawia logiczne myślenie.

Bycie dobrym programistą nie polega na języku, ale na umiejętności rozwiązywania każdego problemu w dowolnym języku. A gdy nie znasz języka, możesz szybko nauczyć się tego języka i efektywnie go używać.

Myślę, że im bardziej globalne jest twoje myślenie, tym lepszy jesteś programistą.

Na przykład możesz dodać użyteczne komentarze do swojego kodu, dbać o czytelność kodu, łatwość konserwacji. Zwróć uwagę na drobne szczegóły. Pomyśl zanim zaczniesz pisać! Dowiedz się więcej o wzorach projektowych. Postępuj zgodnie z dobrymi praktykami.

Ujawnienie: To bezwstydna reklama najgorszego rodzaju, ponieważ pochodzi z mojego bloga.

Jsedano
źródło
4
Czy nauczyłeś się LISP lub Haskell na jakimkolwiek kompetentnym poziomie?
Jimmy Hoffa
10
Słuchanie tego od kogoś, kto nie zna prawie żadnego z tych języków, jest trochę nieszczere. Twierdzisz, że nie są to narzędzia, których teraz potrzebujesz, ale nie masz pojęcia, do czego służą, więc skąd możesz to wiedzieć? W jaki sposób możesz doradzić komuś, czego się od niego nauczy, a czego nie, LISP jest pochodną SQL przydatną tylko w analizie danych relacyjnych, a Haskell może być ścisłym podzbiorem Regexp.
Jimmy Hoffa
10
To tak naprawdę nie odpowiada na pytanie. Udało ci się dokonać imponującego wyczynu, który udzielił niejasnej odpowiedzi na pytanie o dwa nieznane języki: /
Andres F.
2
-1, ponieważ to niejasno tańczy wokół tego , czego dokładnie nauczy cię Common Lisp i Haskell. Przykłady: Kod jako Dane danych jako kod, czystość, przejrzystość referencyjna, abstrakcje monadyczne, programowanie funkcjonalne, programowanie zorientowane na język, programowanie ukierunkowane na typ itp. Itd.
jozefg
3
Ponadto, nie znając żadnego języka, nie sądzę, że możesz odpowiedzieć na to pytanie: / Niestety
jozefg
9

Gdy nauczysz się języków, które są poza paradygmatem, którym zwykle posługujesz się, otworzysz umysł na alternatywne rozwiązania w codziennym życiu, a nawet pomoże ci lepiej zrozumieć niektóre funkcje w wybranym języku. Sama znajomość tych języków nie uczyni cię lepszym programistą, chyba że możesz wziąć lekcje z tych języków i zastosować je w sytuacjach, które widzisz codziennie.

To powiedziawszy, nie ogranicza się do języków. Kiedy czytasz o różnych strukturach danych, których wcześniej nie widziałeś lub których nie używałeś, może to pomóc w poszerzeniu zakresu twojej wiedzy, więc przy następnym napotkaniu problemu masz jeszcze jedno możliwe rozwiązanie.

Jetti
źródło