Лисп или хаскел?
==================

 Добрый день.  
  

Очень нравится своей интеллектуальной изощренностью ФП. Выбираю во что лучше погрузиться: лисп (если да, то какой диалект?) или хаскел? (Английский нормальный, так что, если посоветуете хорошую литературу по теме, буду благодарен).  
  

Т.к. я не программист (пока), а обычный ПМ, то интересен предмет сам по себе, без серьезной практической составляющей (к сожалению).  
  

Требуемые результаты от изучения:  
  

1. Удовольствие от процесса  

2. Прокачка мышления  

3. Лучшее понимание парадигмы ФП, что можно юзать в Джаве и Джаваскрипте.   
  

Критерий один, но серьезный - мало свободного времени;  
  

Пока сложилось такое впечатление:  
  

1. Хаскел - практически вышел на уровень массовых ООП языков, есть тренд в сторону складывания нормальной инфраструктуры - большое коммьюнити, библиотеки, коммерческие проекты. Соответственно он дружелюбнее в плане синтаксиса, общей читабельности, много литературы.  
  

2. ЛИСП - вещь в себе, этакая эзотерическая секта - безбрежен и многолик как океан, малопрактичен, малоприменим, но интересен. 

 Начнём с того, что Лисп не функциональный. Тем, кто приходит в Лисп из мира императивных языков может так казаться, но я пришел в Лисп после Хаскела и я тебе точно говорю, Лисп - не функциональный.  

Теперь по теме - оба языка крайне интересны и способны взорвать мозг, но Хаскел вставляет сильнее, он действительно заумный и изобилует супер-дупер новыми изощренными технологиями программирования (Аппликативные функторы, комбинаторы, монады, ленивые вычисления), но что тебе действительно взорвёт мозг - это чистота языка (нельзя совершать побочные эффекты т.е. не напишешь в консоль где хочешь, не присвоишь значение переменной), отсутствие циклов и декларативность (ты не пишешь "как", а пишешь "что" представляет из себя задача). Но это только в начале. Когда освоишься, оказывается, что Хаскел очень выразителен и краток. Но есть у него и минусы - он очень сложен, ОЧЕНЬ. Серьезно, даже через пол года, у тебя по-прежнему будут проблемы. Уверен, 95% хаскелистов не объяснят в подробности, как работает Hello world на хаскеле, который выглядит так:  

```
main::IO ()
main = do
putStrLn "Hello world!"
```
  

выглядит не сложно, но вот что скрывается под водой: все вычисления происходят в монаде IO т.к. только в ней разрешены побочные эффекты. Побочный эффект (действие ввода-вывода) выполняется только тогда, когда вернётся в main т.к. побочные эффекты разрешены только в main (поэтому и только в монаде IO т.к. main возвращает IO () ). Что такое IO ()? Это как бы список действий, которые туда запихиваются и объединяются в цепочку, чтобы быть последовательными (вне монады порядок выполнения твоих инструкций не определён, счастливого дебага). Эти действия на самом деле не выполняются сразу, а представляют из себя "обещание" сделать это действие, которое реализуется как только что-то уже действующее не затребует результат, в нашем случае это консоль... в общем и это только верхушка айсберга, я еще про типы не говорил, про извлечение и упаковку в монаду, про отображения множеств, карринг и тд.   

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

Теперь пара слов о Лиспе - тут у меня меньше опыта, но идея такая - это программируемый язык программирования. Кроме того, что в нём есть макросы - специальные инструменты, чтобы писать программу которая напишет программу, так и сам язык представляет из себя синтаксическое дерево в своём первозданном виде, что открывает безграничные возможности в метапрограммировании. В общем идея такая - этот язык в умелых руках становится абсолютно чем захочешь. Нравится хаскел и ФП? Отлично, сейчас реализуем. Хочешь ленивые вычисления? На! Хочешь классы? Вот! Хочешь логическое программирование? Держи! При всём этом язык крайне прост, может даже проще Си.   

Так, что я тебе посоветую? Наверное, начинай с Хаскела - он тащит за собой огромную теоретическую базу и целый арсенал таких приёмов программирования, которые тебе и не снились. Выучишь, освоишься - подумай о лиспе. Но! Тебе в любом случае нужно будет ставить Emacs - это самая лучшая среда для этих обоих языков, а Emacs конфигурируется на Emacs Lisp, так что у тебя будет возможность на него посмотреть. Посмотри видео по емаксу [https://www.youtube.com/playlist?list=PLECBtie1W1t...](https://www.youtube.com/playlist?list=PLECBtie1W1tGlrbDDBvcxnttRR4IA5qZn) (там и про Emacs Lisp есть глава), потом качаешь "Хаскел во имя добра" и "О хаскел по-человечески" и читаешь их параллельно - в первой хорошее мягкое введение, а во второй практика - она нужна сразу, чтобы хотябы знать, как создать проект с помощью cabal и собрать его, а то Липовача пол книги в интерпретаторе сидит. 

> Хаскел - практически вышел на уровень массовых ООП языков

  

Что-то верится с трудом.  

> 1. Удовольствие от процесса  
> 
> 2. Прокачка мышления  
> 

  

[ohaskell.dshevchenko.biz/ru/index.html](http://ohaskell.dshevchenko.biz/ru/index.html)  

[learnyouahaskell.com/chapters](http://learnyouahaskell.com/chapters)  

[https://en.wikibooks.org/wiki/Write\_Yourself\_a\_Sch...](https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours)  

Bryan O'Sullivan - Real World Haskell - 2008  

Alejandro Serrano Mena - Beginning Haskell (The Expert's Voice in Programming)  

> 3. Лучшее понимание парадигмы ФП, что можно юзать в Джаве и Джаваскрипте. 

  
[Functional Programming in Java](http://www.amazon.com/Functional-Programming-Java-Harnessing-Expressions/dp/1937785467) 

 Попробуйте Clojure - диалект Lisp. Помимо парадигмы ФП получите возможность использовать Java библиотеки. 

 Сначала Lisp для погружения в ФП, желательно не оригинальный, а какой-нибудь из его диалектов, например, Scheme как, на мой взгляд, наиболее академичный. Потом Haskell для получения практических навыков.  
  

Господам же, рассуждающим о непрактичности Хаскеля, могу посоветовать отказаться от образа мышления "если я что-то не умею, то это сделать нельзя в принципе". Хаскель имеет свое практическое применение в реальной жизни не менее, чем, например, Python. Единственная проблема -- это достаточно высокий порог входа в язык. Высокий для канадского лесоруба, решившего закончить недельные курсы и стать высокооплачиваемым программистом. Что же касается программистов среднего уровня или чуть ниже, то для них Хаскель дает возможность писать быстрые, устойчивые программы, тратя существенно меньше времени, чем на той же Java. Я говорю о реальных программах, а не о задачках с олимпиад о раскладывании монеток по кучкам, о программах в 200+ строк на Хаскеле, что в переводе на С++/Java 2000+ строк. 

 1. если интересует/нравится одна из платформ JVM или .NET и интересует/нравится лисп, то можно выбрать из следующих диалектов лиспа:  

- JVM : Clojure, Armed Bear Common Lisp или Kawa (диалект схемы)  

- .NET: IronScheme  
  

2. Если будешь использовать в качестве редактора/IDE Emacs, то наверное стоит выучить ELisp, чтобы можно было конфигурировать емакс под себя или написать какой-нить полезный плагин.  
  

3. И, наконец, если таки есть свободное время и хочется покопаться в функциональщине, то есть еще: Standard ML, OCaml, Scala, F#, Neverle и другие менее известные. Типа на вкус и цвет)  
  

4. На хаскеле написаны языки: Elm (для вэба), Idris и Agda. И если интересует сугубо вэб, то может стоит посмотреть на Elm, который имеет хаскельный синтаксис и вроде проще хаскеля (насколько мне известно). Также на хаскеле написан диалект схемы HuskScheme(вроде так называется). 

 А кто что скажет про Racket ?  

Читаю PLAI ( <https://cs.brown.edu/~sk/Publications/Books/ProgLangs/> ) ,  

вроде даже без знания лиспа (пролистнул первые 100 страниц SICP, не более)  

примеры дают ощущение понимания, как это на С++ реализовать (диалект racket-plai использует типизацию)