Haskell (www.haskell.org) - чистый, строго типизированный ленивый функциональный язык программирования. В отличие от многих других функциональных языков, он совершенно не содержит императивных черт, и даже те части его, которые выглядят как императивные, на самом деле строго функциональны (ввод-вывод, общение с внешним окружением и т. п.) Название происходит от имени Хаскела Карри (Haskell Curry), известного логика, создателя теории комбинаторов. От его фамилии происходит также название широко распространенной в функциональных языках концепции каррирования (currying). Haskell является в некотором смысле попыткой создать, наконец, действительно функциональных язык программирования, не идя на компромисс с императивным окружением, в котором ему приходится работать. Первая версия языка была опубликована в 1990 году; в настоящее время действует стандарт Haskell 98. Подробнее с историей развития языка можно ознакомится по адресу http://www.haskell.org/haskell-history.html. Основными особенностями языка являются: - Чистота. Функции не могут иметь никаких побочных эффектов, а результат их выполнения зависит исключительно от аргументов. - Сильная статическая типизация. Система типов Haskell'а - одна из самых сильных в более-менее известных языках программирования. Отличительной чертой являются *классы типов*, позволяющие управлять перегрузкой функций. - Ленивые вычисления. Если явно не указано обратное, все значения в программе на Haskell'е вычисляются "лениво" - только в том случае, если они действительно нужны. Это позволяет манипулировать потенциально бесконечными структурами данных, что, в свою очередь, упрощает запись многих алгоритмов. - Монады. Определенные в стандартной библиотеке, монады имеют поддержку и со стороны языка. Монады предоставляют способ комбинирования вычислений, позволяющий экономно и наглядно решать многие проблемы программирования. В частности, применение монад позволило осуществлять операции ввода-вывода, оставаясь в рамках функциональной парадигмы. Разумеется, бескомпромиссность языка не могла обойтись даром. Программы, написанные на Haskell'е, не отличаются высокой скоростью выполнения, что ограничивает его применения в тех сферах, где эта скорость необходима. Впрочем, сам язык не содержит каких-либо принципиальных ограничений на эффективность и распространено мнение, что с дальнейшим усовершенстованием компиляторов эффективность генерируемого ими кода будет существенно возрастать. Известо, что многие функциональные (и не только) языки, разработанные и внедряемые сравнительно небольшим коллективом разработчиков, имеют единственную реализацию. Haskell имеет несколько реализаций, наибольшее внимание из которых заслуживают интерпретатор Hugs и компилятор GHC. Hugs является интепретатором. Он предназначен в основном, для учебных целей, однако полностью поддерживает стандарт Haskell 98, а также многие расширения языка. Среди приятных особенностей нужно отметить компактность дистрибутива, высокую скорость работы, наличие графической среды. GHC - полноценный компилятор языка, написанный на нем самом. Он является основным инструментом при серьезной разработке на Haskell'е, именно в нем появляются и реализуются многие расширения языка, являющиеся кандидатами на включение в следующий стандарт. Следует признать, что Haskell в большей степени остается языком исследователей, а не языком коммерческой разработки. Это не означает, что его нельзя применять в реальных проектах; следует лишь точно выбрать задачу, для решения которой он наиболее пригоден, и быть готовым к тому, что количество библиотек для работы с различными форматами данных, протоколами, системами и т. п. окажется ограниченным. Причиной этого служит как раз исследовательский характер языка. Интерес разработчиков как самого языка, так и большей части библиотек состоит не столько в том, что решить какую-либо задачу, сколько в том, чтобы решить ее наиболее правильным способом. Поэтому количество библиотек растет не слишком быстро - правильные решения всегда трудно искать, а бескомпромиссность языка затрудняет использование "грязных трюков" и поощряет тщательное проникновение в суть проблемы. Положительным итогом такой деятельности служит то, что во многих случаях становится истинным высказывание: "если существует библиотека для Haskell'а, решающая определенную программистскую проблему, значит, в ней эта проблема решена правильно". К сожалению, правильные решения не всегда приживаются в нашем мире... Haskell хорошо подходит для решения задач преобразования входных данных в выходные. Примером может служить задача компиляции. Как правило, скорость выполнения программы в таких задачах не критична, и здесь на передний план выходят такие положительные черты языка, как наглядность, простота, лаконичность, надежность и т. п. Библиотеки (вероятно, не все) перечислены на странице по адресу http://www.haskell.org/libraries/. С точки зрения упомянутых выше "правильных решений" представляют наибольший интерес следующие библиотеки: - Parsec (http://www.cs.uu.nl/~daan/parsec.html). Библиотека parser combinator'ов для Haskell. Позволяет описывать грамматику на самом языке Haskell в записи, близкой к нормальной форме Бэкуса-Наура. С использованием этой библиотеки грамматический разбор перестает быть проблемой. Для C++ существует библиотека Spirit (http://www.boost.org/libs/spirit/), основанная на тех же идеях, однако в отличие от нее Parsec может использоваться для разбора реальных языков практически любой сложности. - WASH (http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/) - набор библиотек комбинаторов, предназначеных для разработки Web-приложений. Основан на идеях, близких к Parsec. - Fudgets (http://www.cs.chalmers.se/ComputingScience/Research/Functional/Fudgets/) - библиотека для разработки графических пользовательских интерфейсов в рамках функциональной парадигмы. - Functional Reactive Programming (http://www.haskell.org/frp/) - целая парадигма программирования "реактивных" систем (т. е. систем, реагирующих на события) на функциональном языке. Из интересных ссылок по этой тематике можно назвать http://www.haskell.org/yale/papers/haskellworkshop01/index.html (интересный взгляд на разработку пользовательских интерфейсов), http://www.haskell.org/yale/papers/haskell-workshop03/index.html (разработка игры с применением концепций Functional Reactive Programming), http://conal.net/fran/tutorial.htm (программироване мультипликации на Haskell. ВНИМАНИЕ! МНОГО КАРТИНОК) - HaskellDB (http://haskelldb.sourceforge.net/) - библиотека комбинаторов для доступа к базам данных. Напомним, что здесь перечислены библиотеки, представляющие интерес именно с точки зрения "правильных решений". Знакомство с этими библиотеками не будет лишним, даже если вы никогда не будете их использовать и даже вообще не будете программировать на Haskell. Однако не исключено, что идеи, заложенные в этих библиотеках, позволят вам по-новому взглянуть на, казалось бы, привычные и знакомые проблемы. Нужно отметить также, что, как правило, у каждой из перечисленных библиотек есть несколько аналогов, предоставляющих более традиционные средства. Так, наряду с библиотекой Parsec существует система генерации парсеров Happy (http://www.haskell.org/happy/), аналогичная системам yacc и bison, а помимо Fudgets для создания GUI можно воспользоваться более традиционными связками к существующим GUI-библиотекам, такими как Gtk2Hs (http://gtk2hs.sourceforge.net/), wxHaskell (http://wxhaskell.sourceforge.net/) или TclHaskell (http://www.dcs.gla.ac.uk/~meurig/TclHaskell/). Полезные ссылки: Главная страница языка: www.haskell.org Учебники: - Gentle Introduction To Haskell (http://www.haskell.org/tutorial/) (в действительности требует внимательного чтения и вряд ли может служить учебником). - Yet Another Haskell Tutorial (http://www.isi.edu/~hdaume/htut/tutorial.pdf) - неплох как учебник, все расписано довольно подробно и доходчиво. Видимо, для англочитающих стоит рекомендовать именно его. - All About Monads (http://www.nomaware.com/monads/html/) - подробное объяснение концепции монад с многочисленными примерами. Wiki: http://haskell.org/hawiki/ Компиляторы: http://www.haskell.org/implementations.html Некоторые ссылки на русском языке: - Введение в язык программирования Haskell. (http://www.wtk.ru/pm/fp/haskell.html) - Лекции по функциональному программированию (http://roman-dushkin.narod.ru/fp.html) - Лекции и лабораторные работы по функциональному программированию и языку Haskell (http://kchri.narod.ru/lecs.pdf, http://kchri.narod.ru/labs.zip) Ссылки на практическое применение: - Haskell in Practice (http://www.haskell.org/practice.html) - Functional Programming in the Real World (http://homepages.inf.ed.ac.uk/wadler/realworld/index.html). Из ссылок обращает на себя внимание http://homepages.inf.ed.ac.uk/wadler/realworld/shop.html - e-commerce-сайт в 500 строк на Haskell.