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?
41
Odpowiedzi:
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 code
motto.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
Innym dobrym przykładem jest szkielet szablonów czkawki:
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.
main
Wartość 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 pobieraa to b
transformację 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.
źródło
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:
Od: Dlaczego Lisp jest przydatny?
Haskell:
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ć.
Ujawnienie: To bezwstydna reklama najgorszego rodzaju, ponieważ pochodzi z mojego bloga.
źródło
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.
źródło