Haskell и Lisp против Haskell или Lisp [закрыто]

40

В настоящее время я пишу код на C, C ++ и Python. Я хочу выбрать функциональный язык программирования, и сейчас я склоняюсь к Хаскеллу. Я НЕ хочу начинать здесь войну "Haskell vs Lisp"; что я хочу знать, так это: если я изучу Haskell, прежде всего, для ознакомления с функциональным программированием, какие преимущества я получу от дальнейшего изучения Lisp?

Зик
источник
1
И F # и Clojure.
CND

Ответы:

58

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

С Common Lisp вы можете добавлять монады, карри и все, что вам нравится из Haskell, но вы также получаете множественное наследование, как упомянул Фрэнк Шеарар, и универсальные функции с множественной диспетчеризацией, а также усовершенствованную систему обработки исключений.

Так почему бы сначала не изучить Common Lisp? Исходя из процедурного и ООП опыта, мой опыт заключался в том, что я действительно не понимал функциональное программирование, пока мне не пришлось использовать его исключительно. Когда функциональное программирование станет удобным, вы можете добавить остальные инструменты, которые предоставляет Common Lisp, и использовать любой инструмент, который лучше всего подходит для стоящей перед вами задачи.

Ларри Коулман
источник
6
Я думаю, что вы прибили это - то, что делает Haskell и Smalltalk настолько полезными для изучения, является их чистотой.
Фрэнк Шиарар
4
Я согласен с тем, что чистота делает изучение языка намного проще. Я не мог понять сам функциональный язык с LISP, потому что все возможно на языке, и у меня слишком много императивов, OO фон. Но в Хаскеле нет таких понятий, которые мешают обучению.
Eonil
1
Забавно, у меня был противоположный опыт. Основные моменты функционального программирования я изучил через свой родной язык Scheme. Я иногда взламываю в Haskell, и я неизбежно обнаруживаю, что мне приходится заново изучать 90% + того, что я знал, когда я покидаю Haskell на некоторое время. При этом, Haskell - невероятно богатый язык, с огромным количеством, чтобы научить вас (очень принудительно). Типы Типы Типы Типы! Следуй за типами!
Джош Инфесто
31

И, пожалуйста.

Насколько я знаю, Haskell учит вас самым чистым из FP, точно так же, как Smalltalk учит самым чистым из ОО. (Я упоминаю это не для того, чтобы предположить, что ОО и ФП не могут вступать в брак, а потому, что оба эти языка являются языками "драгоценных камней" - основная идея, взятая до крайности.)

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

Лисп еще будет чему тебя научить

  • Это мультипарадигма, поэтому, как указывает dsimcha, она покажет вам, как интегрировать FP с другими парадигмами.
  • Лисп научит вас, что «код-данные-данные-код-код», например, через свои макросы.
  • CLOS - очень интересный бренд ОО, с множественным наследованием, которое работает, и универсальными функциями.
Фрэнк Шиарар
источник
11

Позже изучение Lisp позволит вам настроить Emacs, который, пожалуй, является самым продвинутым доступным текстовым редактором. Вы не можете сделать это в Хаскеле.


источник
14
[Точит его скобки]
Инамати
6
Может быть, кто-то может написать текстовый редактор для этого. Я слышал, что операционная система Emacs не поставляется с ней. (Я шучу. Я знаю, что вы можете получить режим Viper. :)
Greyfade
14
На самом деле, есть Emacs-клон по имени Yi, который использует Haskell точно так же, как Emacs использует Lisp. На самом деле, по сравнению с (GNU) Emacs, Yi даже чище, потому что его ядро ​​также написано на Haskell, тогда как ядра Emacs обычно не пишутся на Лиспе. GNU Emacs 'ядро написано на C, JEmacs' написано на Java, например.
Йорг Миттаг
2
@ Йорг, если это частичная переопределение вместо полного клона GNU Emacs или XEmacs, это не одно и то же. Аналогично сравнению Word с Wordpad или Notepad.
1
@ Турбьёрна Равн Андерсен: Да, но не совсем , что плохо. :)
Greyfade
11

Хаскелл и Лисп - два совершенно разных зверя.

Haskell - своего рода «чисто функциональное программирование в башне из слоновой кости»

Lisp - это своего рода «код-данные-данные / данные-код / ​​создание собственных языковых конструкций». Вы можете манипулировать вашим кодом любым способом, который вы можете себе представить.

Они очень разные. Оба разделяют аспект «функционального программирования», но это действительно маленькая общая черта по сравнению с их различиями. Просто попробуйте их, и вы увидите, насколько они разные!

dagnelies
источник
+1: хороший момент. Я знаю немного Haskell и немного Lisp. Несмотря на то, что я не являюсь экспертом ни в одном из них, я думаю, вы правы, что они очень разные. В Haskell у вас нет идеи использовать данные в качестве кода. В Лиспе у вас нет (AFAIK) сопоставления с образцом. Возможно, список (!) Отличий длиннее.
Джорджио
7

Основное преимущество, которое я вижу от изучения Lisp, - это изучение того, как интегрировать FP в ориентированный на реальный мир мультипарадигмальный язык, а не только изучать его в контексте академического языка, который подчеркивает чистоту.

dsimcha
источник
5
Я полагаю, что вы действительно хотите войны "Haskell vs Lisp"!
Дон Роби
3
Haskell - академический язык, который подчеркивает чистоту ... и многие люди используют его в реальном мире. Smalltalk тоже в этом лагере.
Фрэнк Шиарар
Многие люди используют Haskell в реальном мире?
Джон Харроп
1
@Jon Harrop: Ну, я использую Haskell в реальном мире (и он отлично работает для определенных приложений), может быть, я один из немногих (?)
Джорджио
5

Я также пришел из C / C ++ / Python и несколько раз пробовал FP за последние несколько лет. Вначале я посмотрел на Хаскел и не мог понять, что с ним делать, но потом попробовал Окамл, но не стал с этим. Наконец, я начал слышать хорошие слова о Scala, попробовал его и обнаружил, что он мне очень подходит (я также немного занимался Java в прошлом), до такой степени, что после года прыгания в Scala (и отправки 161) У проекта Эйлера проблемы с ним), Хаскелл, похоже, имеет куда больше смысла. На самом деле, я только что заказал пару книг по Haskell и хочу попробовать еще раз, хотя это в значительной степени мотивировано существованием Scalaz.

Таким образом, я нашел, что использование мультипарадигмального языка (то есть Scala, но Lisp, вероятно, тоже подойдет), хороший путь к FP. Но если вы счастливы, погрузившись в Хаскелл (я не был), сделайте это.

timday
источник
Интересно, что со Scala вы получили больше, чем OCaml. Как придешь?
Джон Харроп
@Jon: Хороший вопрос; сложно сказать. Может быть, я просто не был готов «войти в» функционал в то время. Может быть, я просто нашел учебник по Scala на нужном уровне. Возможно, происхождение Scala от C / C ++ / Java просто сделало его немного менее чуждым. Учитывая, что в наши дни любая рациональная ставка была бы на F #, а не на Scala, я, вероятно, в какой-то момент вернусь к домену OCaml, хотя, поскольку я балуюсь этим, просто ради радости от «другого мышления программирования» к моему C ++ Dayjob, у меня есть извращенная склонность, чтобы повторить попытку Haskell снова в следующем.
Timday
Плавное движение :)
Eonil
2

Первоначально я пришел из C / C ++ / Ruby и использовал концепции FP в Ruby всякий раз, когда мог. Государство просто повредило мой мозг. Один из моих приятелей позвонил мне однажды, и он попросил меня написать что-нибудь на Хаскеле (моя первая, и, надеюсь, не последняя, ​​работа на Хаскеле!). Я быстро выучил язык и собрал что-то, что сработало. Это не было красиво или что-то еще, но это работало.

Я взял месячный перерыв от Хаскелла, потому что мне нечем было его использовать. Но когда я решил, что мне нужно написать собственное программное обеспечение для блога, я использовал Haskell ( https://symer.io ). Haskell действительно хорош, потому что вы можете разбить проблему на части и реализовать эти части по-разному в зависимости от ввода. Haskell также очень хорошо справляется со сбоями благодаря интеллектуальному боксу ценностей. Есть так много инструментов для работы с этими блоками, что вы просто забываете, что они существуют.

Мой опыт с lisp (Scheme) был полностью отрицательным. Мало того, что у языка не было этих интеллектуальных, простых инструментов, он чувствовал себя так же опасно свободно, как Ruby или JavaScript. Это был ужасный опыт, и он не предлагает ничего нового, кроме Ruby или Python.

C ++ не может держать свечу на Haskell, вне управления памятью. Haskell такой же быстрый (если не быстрый), значительно более лаконичный и намного более безопасный. Но безопасность Хаскелла никогда не мешает.

TL; TR Haskell - это глоток свежего воздуха, а Lisp - немного более функциональный Ruby.

Нейт Симер
источник