Хаскелл - это Lisp?

Я читал "Дорога к логике, математике и программированию на Haskell" от Doets и Eijck 2004. Кажется, это очень уважаемая книга, но я был поражен, когда заявил, что Haskell является членом семейства Lisp. Это точно? Я бы охарактеризовал Lisp с s-выражениями, нечистыми функциями и списками как единственную составную структуру данных. У Хаскелла этого нет. Чем обосновано это утверждение?

Ответы

Ответ 1

Lisp - очень расплывчатая концепция. Я вижу две более или менее полезные интерпретации:

  1. Lisp как семейство языков, которые разделяют некоторые общие идеи. В широком понимании к этому семейству относятся самые разные языки: Common Lisp, Scheme, Logo, Dylan, Emacs Lisp, Clojure, RLisp, 3Lisp и многие, многие другие.

  2. 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.

Аналогично можно сказать, что функциональный язык программирования:

  1. язык, который поддерживает функциональное программирование: Lisp, APL,..., ML, SML, OCAML, F #, Miranda, Haskell,...

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

  3. язык, который обеспечивает чисто функциональное программирование. Здесь у нас есть 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