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
(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. 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 pobiera a 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.