Я читал "Дорога к логике, математике и программированию на Haskell" от Doets и Eijck 2004. Кажется, это очень уважаемая книга, но я был поражен, когда заявил, что Haskell является членом семейства Lisp. Это точно? Я бы охарактеризовал Lisp с s-выражениями, нечистыми функциями и списками как единственную составную структуру данных. У Хаскелла этого нет. Чем обосновано это утверждение?
Хаскелл - это Lisp?
Ответ 1
Lisp - очень расплывчатая концепция. Я вижу две более или менее полезные интерпретации:
Lisp как семейство языков, которые разделяют некоторые общие идеи. В широком понимании к этому семейству относятся самые разные языки: Common Lisp, Scheme, Logo, Dylan, Emacs Lisp, Clojure, RLisp, 3Lisp и многие, многие другие.
Lisp как линия языков, которые каким-то образом реализуют основной язык (CAR, CDR, CONS, LAMBDA, PROG, SET, SETQ, QUOTE, DEFUN, IF, COND, DO,...): Lisp 1.5, MacLisp, Lisp Machine Lisp, Emacs Lisp, Common Lisp, ISLisp. Обратите внимание, что у этих языков обычно есть "Lisp" как часть их имени.
Некоторые типичные вещи, которые мы находим в диалектах Lisp: строгая оценка, побочные эффекты, прямое императивное программирование, конструкции функционального программирования, s-выражения, оценка, макросы.
Haskell - это совсем другой язык: не строгая оценка, синтаксис, не основанный на верхних s-выражениях, статическая типизация, чисто функциональный.
Haskell не подходит ни 1, ни 2. Итак, я бы сказал, что Haskell не Lisp.
Аналогично можно сказать, что функциональный язык программирования:
язык, который поддерживает функциональное программирование: Lisp, APL,..., ML, SML, OCAML, F #, Miranda, Haskell,...
язык, который обеспечивает функциональное программирование. Здесь Lisp уже не совсем подходит, поскольку императивное или даже объектно-ориентированное программирование не является вторым классом в Lispе.
язык, который обеспечивает чисто функциональное программирование. Здесь у нас есть Haskell в качестве хорошего примера. В качестве относительно нового диалекта Lisp можно использовать и Clojure.
Обычно Lisp поддерживает, но не обеспечивает функциональное программирование. Так что это функциональный язык программирования в более широкой интерпретации.
Haskell - один из языков, который рассматривается как чисто функциональный язык программирования.
Ответ 2
Я думаю, что считать Хаскелла членом семьи LISP довольно сложно, но я подозреваю, что аргументация выглядит примерно так...
При классификации языков программирования имеет смысл разделить их на две группы: те, которые произошли от Фортрана, и те, которые не являются таковыми. В 1958 году "не фортранская группа" в значительной степени означала LISP (по крайней мере, среди языков, которые сегодня не вымерли). Итак, какое-то время родословная языка программирования имела две основные ветки: потомки FORTRAN и потомки LISP. Если это только два варианта, я бы поместил Haskell в ветку LISP.
Однако многие комментаторы считают, что такие языки, как ML, Prolog и APL, возникли "на ровном месте" - вводя достаточно четкие парадигмы, чтобы заслужить родословную для себя. Хаскелл явно родственник МЛ.
В качестве примеров таких классификаций см. следующие родословные языков программирования:
О'Рейли Язык программирования Плакат
Хронология компьютерных языков на levenez.com
HOPL: интерактивный реестр языков программирования (Haskell Entry)
Ответ 3
Я бы не согласился с этим. Они оба являются функциональными языками программирования, и Haskell влияет на Lisp, но Haskell не является производным от Lisp. Просто посмотрите на количество скобок, и вы можете сказать.
Ответ 4
Я думаю, что Haskell - это Lisp в том смысле, что они оба основаны на исчислении λ. Haskell является реализацией λ.
Хотя большинство людей сказали бы, что Haskell принадлежит семье ML. ML также основан на λ, как и все известные мне функциональные языки.
Под капотом OCam (происходящий от ML) скомпилирован в комбинаторную логику, формализм, который эквивалентен λ исчислению, и был изобретен Хаскеллом Карри, логикой, в честь которой назван Хаскелл. Но использование комбинаторной логики для компиляции функционального языка в настоящее время кажется менее популярным, поэтому я не уверен насчет современных компиляторов, таких как GHC.
Синтаксис Lisp практически идентичен λ-исчислению, что делает это семейство (Scheme, Clojure и т.д.) Совершенно особенным.
Ответ 5
То, что люди определяют как шутки, меняется. Исходная спецификация для lisp вообще не упоминала макросы, а определяла лишь небольшой список примитивных функций, которые, если мне не изменяет память, следующие:
cons
car
cdr
cond
eq
atom
and
or
not
nil
Это может быть не полный список, или в нем может быть несколько дополнительных членов, но в любом случае, оригинальная спецификация Джона Маккарти была очень маленькой.
Если вы определяете lisp как любой язык, который определяет все эти функции, то большинство современных языков - это lisps, включая haskell.
Более строгое и современное определение шрифта выглядит следующим образом:
- нетерпеливая оценка
- динамическая типизация
- нечистый функционал
- макросы
- сосредоточиться на списках в качестве первичной структуры данных
Haskell не подходит для первых трех, его макросы (шаблон haskell) не следуют парадигме "код-данные-данные", и хотя списки очень важны, они не являются основной структурой данных.
Так что я бы сказал, нет, Хаскелл не шутка.
Ответ 6
Я бы сказал, что оба являются функциональными языками, что делает их принадлежащими к одной семье. Однако я бы не назвал Haskell производным Lisp (как Scheme).
Ответ 7
Можно утверждать, что все функциональные языки являются потомками Scheme в той степени, в которой Scheme наткнулся примерно на реализацию лямбда-исчисления (хотя и с причудами), а функциональные языки также реализуют лямбда-исчисление, хотя они не всегда выглядят так. Кроме того, возможно, линия ML полностью отличается, потому что она восходит к Landin ISWIM, который был влиятельным, но никогда не реализованным, имел очень мало общего с Lispом, и с самого начала знал его теоретические основы.
Правда в том, что у Haskell и Lisp гораздо больше общего друг с другом, чем с семейством C или семейством Prolog.
Я бы сказал, что люди должны смотреть в прошлое на синтаксические проблемы, но я забыл, что Lispерс определяет синтаксис как ключевую часть того, что значит быть шуткой. Что я считаю глупым, потому что тогда, возможно, Haskell не Lisp, но Liskell, хотя последний по сути является процессором для первого.
Ответ 8
Хаскелл, конечно, не шутит. У каждого свое понимание, что за хрень "лисп". IMHO lisp - это язык, где исходный код является допустимой структурой на том же языке. Исходный код на Haskell не является допустимой структурой в haskell, поэтому для управления собственным исходным кодом у них должен быть отдельный синтаксис (шаблон Haskell).
Но есть по крайней мере одна интересная особенность в haskell, которая напоминает мне о lisp. Это синтаксис вызовов функций: func args1 agr2 arg3. Lisp имеет точно такой же синтаксис: (func args1 agr2 arg3). На самом деле, вы можете включить в haskell и внешних паренов. Все остальные языки семейства algol вводят между именем функции и аргументами символы запятой и запятые.
Ответ 9
Hoyte сравнивает некоторые языки и утверждает, что Haskell НЕ является Lispом, потому что он слишком строг в типах и только для ученых, тогда как Common Lisp больше похож на язык прототипирования (без строгости, динамическая типизация).
См. "Пусть больше лямбды - 50 лет Lisp" Дуга Хойта (продвинутая книга о Common Lisp, http://letoverlambda.com/)
Haskell и Common Lisp (вероятно, все Lisps) оптимизированы для парадигмы функционального программирования (FP). Хаскель чист, тогда как Common Lisp нечист. Сравните с термином FP также "общее функциональное программирование".
Также взгляните на эту диаграмму, сравнивая парадигмы языка программирования: http://www.info.ucl.ac.be/~pvr/paradigms.html