Является ли Haskell Лиспом?

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


person Bob Bobson    schedule 14.01.2011    source источник
comment
Я не согласен, но какой аргумент приводили авторы?   -  person Tobu    schedule 15.01.2011
comment
Никто! Они дают общее введение и говорят, что «как функциональный язык Haskell является частью семейства Lisp вместе с ML, Occam и Clean».   -  person Bob Bobson    schedule 15.01.2011
comment
Ну это подделка. Возможно, Lisp был первым функциональным языком, но это не делает все функциональные языки шепелявыми, точно так же, как Java — это не Smalltalk, а Python — не C. Возможности Haskell для начинающих (для начала: монады, алгебраические типы данных и сопоставление с образцом).   -  person    schedule 15.01.2011
comment
Списки не являются единственной составной структурой данных в Лиспе. Они просто используются для синтаксического дерева.   -  person Svante    schedule 15.01.2011
comment
Разве это не «мне любопытно», считают ли другие люди, что я делаю «вопрос»? Согласно FAQ, их следует избегать.   -  person Ken    schedule 02.06.2011
comment
Голосуйте, чтобы закрыть и перейти к программистам.   -  person user7116    schedule 02.06.2011
comment
@delnan: Lisp на самом деле представляет собой семейство языков, и некоторые из них имеют очень продвинутые функции (посмотрите на Qi и Shen).   -  person Tikhon Jelvis    schedule 12.01.2012
comment
@TikhonJelvis: я действительно слышал о Ци. То немногое, что я видел о системе типов, безусловно, впечатляет. Я не уверен, что многие посчитают его Лиспом (да, он реализован в Лиспе и находится под влиянием Лиспа, но Java также не является С++) - похоже, он сильно отличается от большинства (всех?) существующих диалектов Лиспа и добавляет основные концепции, а оставшееся сходство заключается в некоторых общих основах, таких как списки, неопределенная связь с лямбда-исчислением и S-выражения/гомоиконичность. (На самом деле, я не нашел ни одного заявления о том, что Qi — это шепелявость, в Википедии и на веб-сайте Qi.)   -  person    schedule 12.01.2012
comment
@delnan: По крайней мере, Qi построен на основе Common List и наследует все функции Lisp, которых нет в ML и Haskell. Вы также можете смешивать функции Common Lisp и Qi в одном файле. Я думаю, что это делает Qi частью семейства Lisp. (Цитата взята из кодовой страницы Qi в Google.)   -  person Tikhon Jelvis    schedule 12.01.2012
comment
1.) Сопоставление с образцом было впервые реализовано в Lisps, в SCIP есть упражнение для его реализации. Что сбивает с толку, так это то, что Лисперы затем игнорировали сопоставление с образцом и делали все с помощью cadr и caddadaaadr... Монады — это типобезопасные способы программирования в макросах, которые переопределяют/расширяют let, apply и do(progn), а также setf && другие . Кажется, в Лиспе это называлось контекстами. АТД являются типобезопасными s-выражениями.   -  person aoeu256    schedule 28.03.2021


Ответы (9)


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

  1. Лисп как семейство языков, которые имеют некоторые общие идеи. В широком понимании к этому семейству относятся очень разные языки: 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 Лисп, Emacs Лисп, Коммон Лисп, ISLisp. Обратите внимание, что в названии этих языков обычно есть слово «Lisp».

Некоторые типичные вещи, которые мы находим в диалектах Лиспа: строгое вычисление, побочные эффекты, прямое императивное программирование, конструкции функционального программирования, s-выражения, вычисление, макросы.

Haskell — это совсем другой язык: нестрогие вычисления, синтаксис, не основанный на s-выражениях, статическая типизация, чисто функциональный.

Haskell не подходит ни для 1, ни для 2. Так что я бы сказал, что Haskell — это не Lisp.

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

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

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

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

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

Haskell — один из языков, который считается чисто функциональным языком программирования.

person Rainer Joswig    schedule 14.01.2011
comment
Да, помимо синтаксиса, JavaScript, вероятно, больше похож на Lisp, чем на Haskell. (Первоначально задумывался как реализация Scheme...) - person Kevin Cantu; 15.01.2011
comment
@Кевин Канту: Это не случайно. Брендан Эйх упоминает на своем веб-сайте, что Netscape наняла его, пообещав реализовать Scheme в браузере. ;-) - person Rainer Joswig; 15.01.2011
comment
Кстати, мне не хватает гомоиконичности как одного из отличительных свойств LISP (хотя это можно было бы вывести из упоминания s-выражений) - person hvr; 16.01.2011
comment
@hvr: это потому, что «гомоиконичность» - сбивающий с толку термин, который мало используется в мире Лиспа. Там мы говорим о вычислениях с символическими выражениями (см. оригинальную статью Маккарти о Лиспе). Иногда мы говорим о «коде как данных». - person Rainer Joswig; 16.01.2011

Я думаю, что с натяжкой рассматривать Haskell как члена семейства LISP, но я подозреваю, что рассуждения выглядят примерно так...

При классификации языков программирования имеет смысл разделить их на две группы: производные от FORTRAN и не являющиеся потомками. В 1958 году группа не FORTRAN в значительной степени означала LISP (по крайней мере, среди языков, которые не вымерли сегодня). Итак, какое-то время генеалогическое древо языков программирования имело две основные ветви: потомки FORTRAN и потомки LISP. Если это единственные два варианта, я бы поместил Haskell в ветку LISP.

Тем не менее, многие комментаторы считают, что такие языки, как ML, Prolog и APL, возникли на ровном месте, представив достаточно разные парадигмы, чтобы заслужить собственное происхождение. Haskell явно связан с ML.

В качестве примеров таких классификаций см. следующие семейные деревья языков программирования:

Плакат O'Reilly по языку программирования

Хронология компьютерных языков на сайте levenez.com

HOPL: интерактивный список языков программирования (вход на Haskell)

person WReach    schedule 15.01.2011
comment
Ссылка O'Reilly перемещена, вместо этого посмотрите cdn.oreillystatic.com/news/graphics/ prog_lang_poster.pdf - person devon; 21.07.2020

Я бы не согласился с этим. Оба они являются функциональными языками программирования, и Lisp повлиял на Haskell, но Haskell не является производным от Lisp. Просто посмотрите на количество скобок, и вы все поймете.

person mnuzzo    schedule 14.01.2011
comment
Система типов гораздо важнее синтаксиса! - person Jonathan Sterling; 17.04.2011

То, что люди определяют как шепелявость, варьируется. Первоначальная спецификация лиспа вообще не упоминала макросы и определяла лишь небольшой список примитивных функций, которые, если мне не изменяет память, следующие:

  • cons
  • car
  • cdr
  • cond
  • eq
  • atom
  • and
  • or
  • not
  • nil

Это может быть неполный список или в нем может быть несколько дополнительных членов, но в любом случае Первоначальная спецификация Джона Маккарти была очень маленькой.

Если вы определяете lisp как любой язык, который определяет все эти функции, то большинство современных языков, включая haskell, являются lisp.

Более строгое и современное определение шепелявости выглядит следующим образом:

  • нетерпеливая оценка
  • динамическая типизация
  • нечистый функционал
  • макросы
  • сосредоточиться на списках как на первичной структуре данных

Haskell не подходит к первым трем, его макросы (шаблон haskell) не следуют парадигме код-данные, и хотя списки очень важны, они не являются основной структурой данных.

Так что я бы сказал нет, Haskell не шепелявит.

person adrusi    schedule 27.12.2011
comment
Что вы имеете в виду под парадигмой «код — это данные»? Template Haskell может манипулировать синтаксическими деревьями; что еще нужно? - person dfeuer; 26.08.2019

Я думаю, что Haskell является Лиспом в том смысле, что они оба основаны на λ-исчислении. Haskell — это реализация λ.

Хотя большинство людей сказали бы, что Haskell принадлежит к семейству ML. ML также основан на λ, как и все известные мне функциональные языки.

Под капотом OCam (потомок ML) скомпилирован в комбинаторную логику, формализм, эквивалентный λ-исчислению, и был изобретен Хаскеллом Карри, логиком, в честь которого назван Haskell. Но использование комбинаторной логики для компиляции функционального языка в настоящее время кажется менее популярным, поэтому я не уверен в современных компиляторах, таких как GHC.

Синтаксис Lisp почти идентичен λ-исчислению, что делает это семейство (Scheme, Clojure и т. д.) особенным.

person Yan King Yin    schedule 02.06.2011
comment
Говоря очень неформально, Лиспы в основном эквивалентны нетипизированному лямбда-исчислению. Haskell в основном представляет собой типизированное лямбда-исчисление благодаря системе типов Хиндли-Милнера. Я думаю, что этого различия достаточно, чтобы утверждать, что Haskell не является Лиспом. - person mikera; 23.07.2012

Хаскель, конечно, не лисп. У каждого свое понимание того, что такое, черт возьми, "сюсюканье". IMHO lisp - это язык, исходный код которого является допустимой структурой на том же языке. Исходный код Haskell не является допустимой структурой в haskell, поэтому они должны иметь отдельный синтаксис (шаблон Haskell) для управления собственным исходным кодом.

Но в haskell есть по крайней мере одна интересная особенность, которая напоминает мне lisp. Это синтаксис вызовов функций: func args1 agr2 arg3. Лисп имеет ТОЧНО такой же синтаксис: (func args1 agr2 arg3). На самом деле вы можете включать внешние скобки и в haskell. Все остальные языки семейства алголов вводят скобки и запятые между именем функции и аргументами.

person Vagif Verdi    schedule 20.01.2011
comment
Исходный код Лиспа может быть структурой данных в Лиспе, потому что Лисп динамически типизирован и легко обрабатывает список, который содержит смесь символов, строк, чисел, векторов, других списков и т. д. - person Kaz; 07.03.2012

Я бы сказал, что оба являются функциональными языками, что делает их принадлежащими к одной семье. Однако я бы не назвал Haskell производным от Lisp (как Scheme).

person David Weiser    schedule 14.01.2011

Можно утверждать, что все функциональные языки являются потомками Scheme в той мере, в какой Scheme грубо наткнулся на реализацию лямбда-исчисления (хотя и с причудами), а функциональные языки также реализуют лямбда-исчисление, хотя они не обязательно всегда выглядят так. Кроме того, возможно, родословная ML совершенно отлична, потому что она восходит к ISWIM Ландина, который был влиятельным, но так и не был реализован, имел очень мало общего с Lisp и с самого начала знал его теоретические основы.

На самом деле, однако, Haskell и Lisp имеют гораздо больше общего друг с другом, чем с семейством C или семейством Prolog.

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

person sclv    schedule 14.01.2011
comment
Схема? Нет нет нет. Схема — модный современный материал. Когда мы говорим об основах функционального программирования, мы говорим о том раннем примитивном Лиспе, который сегодня презирают даже Лисперы. - person ; 15.01.2011
comment
Ранний примитивный lisp не решал funargs, хотя примерно в то же время это делали. Нет надлежащего лексического объема и функций первого класса = не работает удаленно. - person sclv; 15.01.2011
comment
Родословная ML отличается, поскольку она старше, чем Scheme. То же самое касается линии Миранды (SASL - KRC - Миранда - Хаскелл). Опубликованная работа над Scheme датируется примерно 1976 годом, я думаю, SASL датируется 1972 годом. LCF, первоначальный хост для ML, датируется 1972 годом, хотя я не знаю статуса ML в нем. FP Бэкуса может даже предшествовать Схеме. - person stephen tetley; 15.01.2011
comment
@delnan: Скорее всего, Схема старше вас, если вам не 36 лет или больше. - person leppie; 20.01.2011
comment
@sclv: Scheme разделяет семантику ML, как и многие другие, такие как OCaml, F#, SML и даже LISP-1. - person leppie; 20.01.2011
comment
@leppi: Это так. Но первая вещь, называемая Scheme, заметно моложе оригинального Lisp Маккарти. Кроме того, модные современные вещи кажутся вам очень серьезными? - person ; 20.01.2011

Хойт сравнивает некоторые языки и утверждает, что Haskell НЕ является Лиспом, потому что он слишком строг в отношении типов и предназначен только для ученых, тогда как Common Lisp больше похож на язык прототипирования (без строгости, динамическая типизация).

См.: Let Over Lambda — 50 Years of Lisp Дуга Хойта (продвинутая книга о Common Lisp, http://letoverlambda.com/< /а>)

Haskell и Common Lisp (вероятно, все Lisp) оптимизированы для парадигмы функционального программирования (FP). Haskell чист, тогда как Common Lisp нечист. Сравните термин FP также с «полным функциональным программированием».

Также взгляните на эту диаграмму, сравнивающую парадигмы языков программирования: http://www.info.ucl.ac.be/~pvr/paradigms.html

person Gerold Meisinger    schedule 22.01.2011
comment
Взгляд Хойта на шепелявость обычно считается несколько... своеобразным. - person sclv; 23.01.2011