Я знаю, что Lisp и Haskell являются логическими и функциональными языками программирования соответственно, но что именно это означает? Чем они отличаются от других языков? Я слышал, что их изучение сделает вас лучшим программистом и улучшит вашу логику. Это правда, и если я пойду изучать Lisp или Haskell на компетентный уровень, улучшится ли мое программирование, и я лучше справлюсь с любой проблемой на любом языке? Я просто хотел знать, стоит ли им усилий для обучения. Также полезны ли эти языки в таких областях, как графический интерфейс и графика, или они просто полезны для консольных приложений?
41
Ответы:
Это очень похоже на изучение математики, которая улучшит ваши аналитические способности, а изучение латинской / классической литературы улучшит ваши навыки письма.
Люди, разработавшие эти языки, много думали о том, что означает написание программы. И эти языки - результаты этих исследований.
Тем не менее, изучение Java также сделает вас лучшим программистом. И изучение C. Настоящая выгода приходит от изучения языков с другой философией. Тогда вы можете иметь собственное мнение о том, как программа должна быть написана.
редактировать
Я понимаю, что этот ответ не очень полезен для людей, которые еще не изучили haskell и / или lisp. Вот несколько примеров, чтобы объяснить, что я имею в виду
Лисп
Лисп считает, что синтаксис должен быть минимальным, и что все должно быть либо списком, либо примитивом (Лисп означает «обработка списка»). Даже программы в основном представляют собой список, содержащий другие списки и символы. Lisp позволяет вам манипулировать программами в виде списка и генерировать новые программы на лету. Отсюда и весь
code is data and data is code
девиз.Прямым следствием является то, что языки Lisp позволяют вам определять любой интерфейс, который вы хотите. Хорошим примером является compojure, который представляет собой закрытый веб-фреймворк. Вот как выглядит функция маршрутизации
Другой хороший пример - шаблонная структура икоты:
Как видите, результат такой же краткий, как и в 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, вы в основном узнаете о преимуществах чистоты и о том, как писать чистый код.
источник
tl; dr Изучение новых вещей может только сделать вас лучшим программистом, но быть лучшим программистом - это не языки, на которых вы можете писать код.
Каковы преимущества использования LISP и Haskell?
LISP:
От: Чем полезен Лисп?
Haskell:
Вы можете прочитать там описание Функционально против императива
От: http://www.haskell.org/haskellwiki/Introduction
Они сделают меня лучшим программистом?
Да, конечно, знание большего количества языков и парадигм может только сделать вас лучшим программистом, но сделайте это прямо:
Нет ни одного инструмента, ни одной книги, ни одной парадигмы программирования, которая сделает вас лучшим программистом.
Изучение разных языков программирования с разными парадигмами определенно поможет вам стать лучшим программистом, а умение решать проблемы с разными подходами также принесет пользу вашему логическому мышлению.
Быть хорошим программистом - это не столько язык, сколько способность решать любые проблемы на любом языке. А когда вы не знаете язык, способность быстро выучить этот язык и эффективно его использовать.
Раскрытие: Это бесстыдная реклама худшего вида, потому что она из моего блога.
источник
Когда вы изучаете языки, которые выходят за рамки той парадигмы, которой вы обычно пользуетесь, это откроет вам разум для альтернативных решений в вашей повседневной жизни и может даже помочь вам лучше понять некоторые функции на выбранном вами языке. Знание этих языков не сделает вас лучшим программистом, если вы не сможете извлечь уроки, извлеченные из этих языков, и применять их в ситуациях, которые вы видите каждый день.
При этом, это не ограничивается языками. Когда вы читаете о различных структурах данных, которые вы не видели или не использовали ранее, это может помочь расширить область ваших знаний, поэтому в следующий раз, когда вы столкнетесь с проблемой, у вас будет еще одно возможное решение.
источник