Это очень похоже на изучение математики, которая улучшит ваши аналитические способности, а изучение латинской / классической литературы улучшит ваши навыки письма.
Люди, разработавшие эти языки, много думали о том, что означает написание программы. И эти языки - результаты этих исследований.
Тем не менее, изучение Java также сделает вас лучшим программистом. И изучение C. Настоящая выгода приходит от изучения языков с другой философией. Тогда вы можете иметь собственное мнение о том, как программа должна быть написана.
редактировать
Я понимаю, что этот ответ не очень полезен для людей, которые еще не изучили haskell и / или lisp. Вот несколько примеров, чтобы объяснить, что я имею в виду
Лисп
Лисп считает, что синтаксис должен быть минимальным, и что все должно быть либо списком, либо примитивом (Лисп означает «обработка списка»). Даже программы в основном представляют собой список, содержащий другие списки и символы. Lisp позволяет вам манипулировать программами в виде списка и генерировать новые программы на лету. Отсюда и весь code is data and data is code
девиз.
Прямым следствием является то, что языки Lisp позволяют вам определять любой интерфейс, который вы хотите. Хорошим примером является compojure, который представляет собой закрытый веб-фреймворк. Вот как выглядит функция маршрутизации
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Другой хороший пример - шаблонная структура икоты:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Как видите, результат такой же краткий, как и в DSL, как усы, но позволяет использовать такие языковые функции, как (for [x (range 1 4)] block)
. Еще приятнее, у вас есть все инструменты для абстрагирования и структурирования вашего кода.
В других языках синтаксис более сложный. Вы не можете прочитать Java-программу как набор списков. Но используя Lisp, вы получите лучшее представление о том, как должен выглядеть идеальный интерфейс, и что в вашем коде можно абстрагировать как данные. Это также поможет вам увидеть ваш любимый язык в виде большой структуры данных и лучше понять его семантику.
Haskell
Haskell верит в строгую статическую типизацию и чистоту. Чистые функции похожи на математические функции: они определены для набора значений и отображают их в другом наборе. Функция не имеет побочных эффектов, а значения неизменны. Чистота интересна, потому что это не то, что может иметь язык мультипарадигмы. Язык либо чистый, либо нет.
Одним из следствий этого является то, что вы не можете выполнять действия ввода-вывода, когда хотите (haskellers считает, что это хорошо). Действия IO определяются как транзакции, которые сами по себе являются чистыми значениями. main
Стоимость программы Haskell является операцией ввода - вывода выполняется при запуске программы.
Вы должны явно иметь дело с потоком данных в вашей программе. Вы не можете заставить двухкомпонентное общение писать и читать вещи в глобальной переменной. Вы должны строить и передавать значения.
Еще одна особенность, упомянутая Джимми Хоффой, - это система богатых типов. В то время как другие языки имеют статическую типизацию, в haskell вы можете иметь такие вещи, как:
length :: [a] -> Int
(функция из списка от a до int)
map :: (a -> b) -> [a] -> [b]
(функция, которая принимает a to b
преобразование и список а и возвращает список б)
Приятно то, что мне не нужно объяснять, что на самом деле делают эти функции: вы уже понимаете их поведение. Более того, функции с этими сигнатурами не могут ничего, кроме как вычислить длину списка и отобразить преобразование по списку.
В других типизированных языках иерархии классов в сочетании с изменчивостью делают работу с этими типами кошмаром. Вы должны понимать такие вещи, как ковариация и контравариантность, которые невозможно понять правильно с точки зрения языка (т.е. простые, мощные и безопасные).
Либо вы выбираете безопасный путь (например, scala) и в итоге получаете действительно сложный язык, либо вы выбираете простой путь и получаете что-то ограниченное (google go generics ограничено списком и картами) или небезопасное (дротики generics, которые всегда ковариантны).
Используя haskell, вы в основном узнаете о преимуществах чистоты и о том, как писать чистый код.