Каковы преимущества использования LISP и Haskell? Они сделают меня лучшим программистом? [закрыто]

41

Я знаю, что Lisp и Haskell являются логическими и функциональными языками программирования соответственно, но что именно это означает? Чем они отличаются от других языков? Я слышал, что их изучение сделает вас лучшим программистом и улучшит вашу логику. Это правда, и если я пойду изучать Lisp или Haskell на компетентный уровень, улучшится ли мое программирование, и я лучше справлюсь с любой проблемой на любом языке? Я просто хотел знать, стоит ли им усилий для обучения. Также полезны ли эти языки в таких областях, как графический интерфейс и графика, или они просто полезны для консольных приложений?

Logan545
источник
36
Использование LISP и Haskell сделает вас лучшим программистом на LISP и Haskell, я гарантирую это.
Нил
17
@MasonWheeler я должен сказать; в системе типов Haskell есть много чего вы не найдете ни на одном другом языке, а макросы LISP нигде не встречаются ни на одном из основных языков. Обе эти вещи стоит обучение , потому что они действительно сделать вас лучшим программистом в вашем рабочем языке. По крайней мере, это был мой опыт; Haskell сделал меня лучшим разработчиком корпоративного C #. Я знаю методы для чистого разделения задач, которых у меня никогда не было бы иначе, и проблемы с анализом навсегда будут для меня намного проще, чем до того, как я выучил Haskell.
Джимми Хоффа
6
Эрланг - это функциональный язык. Rabbit MQ написан на Erlang, а Rabbit используется во многих местах для выполнения тяжелой тяжелой работы. Функциональные языки учат вас по-другому думать о программировании, и это хороший дополнительный инструмент, который вы можете получить. Хотя это правда, некоторые из этих концепций превратили его в более популярные языки (например, лямбда-выражения в C # и C ++), но при использовании функционального языка вы по-прежнему подходите к решению проблем совершенно по-другому.
Двоичный беспорядок
8
@MasonWheeler Существуют совершенно веские причины, по которым язык может быть более полезным, чем остальные, но все же широко не используется. Я могу думать о многих: существующая база пользователей, слишком радикальные изменения, когда «хорошо - это хорошо, хорошо», а также ... когда лучший инструмент требует программистов, которые более формально обучены. Таким образом, популярность не является хорошей мерой полезности .
Андрес Ф.
5
@MasonWheeler Чтобы использовать аналогию, математика является чрезвычайно полезной областью в реальной жизни. Так почему же больше людей не разбираются в математике? Почему многие люди боятся этого и думают, что это чёрная магия, а не такая уж и полезная?
Андрес Ф.

Ответы:

37

Это очень похоже на изучение математики, которая улучшит ваши аналитические способности, а изучение латинской / классической литературы улучшит ваши навыки письма.

Люди, разработавшие эти языки, много думали о том, что означает написание программы. И эти языки - результаты этих исследований.

Тем не менее, изучение 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, вы в основном узнаете о преимуществах чистоты и о том, как писать чистый код.

Саймон Бергот
источник
1
@JimmyHoffa Я думаю, что на самом деле заслуживает своего ответа, потому что это то, что люди склонны упускать из виду. Существуют проблемные области, которые лучше всего решаются с помощью функционального программирования, о которых люди даже не подозревают, пока они, по крайней мере, не занимались этими областями за пределами своей зоны комфорта.
KChaloux
2
Я не знаю о Ассамблее, и я не упомянул об этом. Однако сборка может помочь вам понять, как работают ваши программы. На SO написано большое сообщение о людях, которые могут проанализировать фрагмент сгенерированной сборки, чтобы объяснить проблему с производительностью.
Саймон Бергот
3
@KChaloux Я бы написал ответ, но этот вопрос должен быть закрыт (я проголосовал соответственно). Проще говоря, я мог бы написать свое мнение и опыт в ответе, но он был бы не более правильным или неправильным, чем другие ответы, поскольку проблема заключается в вопросах с рекомендациями по языку и почему я проголосовал за закрытие.
Джимми Хоффа
7
OMG, @Neil зная , что компьютер на самом деле делает большинство несомненно сделает вас лучшим программистом. Я не писал сборку годами, но регулярно читаю ее (на множестве платформ), и если вы заботитесь о том, как на самом деле работает ваша программа, важно знать хотя бы основы.
штрих-кот-бах
3
@ Нейл, в каком случае выгода для худшего программиста? Что заставляет вас воспитывать спагетти-код? Как спагетти-код связан с ассемблером или хорошим программистом, кроме как в стране фантазий о незнании ассемблера и необходимости рационализации, чтобы избежать его изучения? Во всяком случае, хорошее программирование на ассемблере делает человека хорошо осведомленным о плохой практике кодирования.
дэш-том-бэнг
12

tl; dr Изучение новых вещей может только сделать вас лучшим программистом, но быть лучшим программистом - это не языки, на которых вы можете писать код.

Каковы преимущества использования LISP и Haskell?

LISP:

  1. Гомоиконный код. Это позволяет структурировать самоизменяющийся код.
  2. Синтаксические макросы. Они позволяют переписать стандартный код.
  3. Прагматизм. CL предназначен для того, чтобы работать с профессионалами. Большинство функциональных языков, как правило, нет.
  4. Гибкость. Он может делать много разных вещей, все на разумных скоростях.
  5. Wartiness. Реальный мир грязный. Прагматическое кодирование приводит к тому, что приходится либо использовать, либо придумывать грязные конструкции. Обычный Лисп обладает достаточной настороженностью, чтобы справляться с делами.

Возможно, единственная реальная причина выбора против CL состоит в том, что стандартные библиотеки датированы.

Я выйду на передний план и скажу, что в общем случае синтаксис не должен быть проблемой для профессионального программиста.

От: Чем полезен Лисп?

Haskell:

Haskell - это язык программирования. В частности, это полиморфно статически типизированный, ленивый, чисто функциональный язык, весьма отличающийся от большинства других языков программирования. Язык назван в честь Хаскелла Брукса Карри, чья работа по математической логике служит основой для функциональных языков. Haskell основан на лямбда-исчислении, поэтому лямбда мы используем в качестве логотипа.

Вы можете прочитать там описание Функционально против императива

От: http://www.haskell.org/haskellwiki/Introduction

Они сделают меня лучшим программистом?

Да, конечно, знание большего количества языков и парадигм может только сделать вас лучшим программистом, но сделайте это прямо:

Нет ни одного инструмента, ни одной книги, ни одной парадигмы программирования, которая сделает вас лучшим программистом.

Изучение разных языков программирования с разными парадигмами определенно поможет вам стать лучшим программистом, а умение решать проблемы с разными подходами также принесет пользу вашему логическому мышлению.

Быть хорошим программистом - это не столько язык, сколько способность решать любые проблемы на любом языке. А когда вы не знаете язык, способность быстро выучить этот язык и эффективно его использовать.

Я думаю, что чем более глобально ваше мышление, тем лучше вы разработчик.

Например, вы можете добавить полезные комментарии к своему коду, позаботиться о читабельности вашего кода, удобстве сопровождения. Обратите внимание на мелкие детали. Подумайте, прежде чем печатать! Узнайте о дизайне моделей. Следуйте хорошей практике.

Раскрытие: Это бесстыдная реклама худшего вида, потому что она из моего блога.

jsedano
источник
4
Вы изучили LISP или Haskell на каком-либо компетентном уровне?
Джимми Хоффа
10
Немного неискренне слышать это от того, кто почти ничего не знает ни на одном языке. Вы утверждаете, что они не являются необходимыми вам инструментами, но вы не представляете, для чего они нужны, так как вы можете это знать? Кроме того, как вы можете сообщить кому-то, что он узнает или не узнает от него, насколько вам известно, что LISP - это производная от SQL, полезная только для анализа реляционных данных, и Haskell может быть строгим подмножеством Regexp.
Джимми Хоффа
10
Это на самом деле не отвечает на вопрос. Вы преуспели в этом впечатляющем подвиге - дать смутно общий ответ на вопрос о двух языках, которые вы не знаете: /
Андрес Ф.
2
-1 потому что это смутно танцует вокруг того , чему вас учат Common Lisp и Haskell. Примеры: код как данные, данные как код, чистота, ссылочная прозрачность, монадические абстракции, функциональное программирование, языковое программирование, программирование на основе типов и т. Д. И т. Д. И т. Д.
Даниэль Гратцер,
3
Кроме того, не зная ни одного языка, я не думаю, что вы можете ответить на этот вопрос: / Извините
Даниэль Гратцер
9

Когда вы изучаете языки, которые выходят за рамки той парадигмы, которой вы обычно пользуетесь, это откроет вам разум для альтернативных решений в вашей повседневной жизни и может даже помочь вам лучше понять некоторые функции на выбранном вами языке. Знание этих языков не сделает вас лучшим программистом, если вы не сможете извлечь уроки, извлеченные из этих языков, и применять их в ситуациях, которые вы видите каждый день.

При этом, это не ограничивается языками. Когда вы читаете о различных структурах данных, которые вы не видели или не использовали ранее, это может помочь расширить область ваших знаний, поэтому в следующий раз, когда вы столкнетесь с проблемой, у вас будет еще одно возможное решение.

Jetti
источник