Для программирования в Haskell нам понадобится компилятор. Мы будем пользоваться наиболее развитым компилятором – GHC. Лучше всего устанавливать его вместе с Haskell Platform:
Haskell Platform содержит стабильную версию компилятора и много хороших, проверенных временем библиотек. Если по каким-то причинам установить Haskell Platform не удалось. Не отчаивайтесь, можно загрузить компилятор с сайта GHC:
И далее установить все необходимые библиотеки с Hackage с помощью cabal
(устанавливается отдельно с http://www.haskell.org/cabal/).
Для Haskell существует очень мало сред разработки. Обычно на Haskell программируют в каких-нибудь продвинутых текстовых редакторах (vim, Emacs, scite, kate, notepad++). Отметим всё же среду разработки Leksah (http://leksah.org/), она написана на Haskell и её можно установить с Hackage.
Если вы не хотите разбираться с новым текстовым редактором или средой разработки, и вам нужна лишь подсветка синтаксиса можно воспользоваться gedit. Пишем код в gedit, сохраняем, переключаемся на ghci, пробуем, обновляем, пробуем, при случае компилируем или собираем в пакет. Всё это можно делать и в gedit.
О Haskell написано много интересных книг и статей, но все они на английском. На русском языке выходит электронный журнал “Практика функционального программирования” (
Я бы хотел рассказать о тех книгах и статьях, которые мне помогли. Все они приняли активное участие в создании этой книги.
Miran Lipovaa. Learn You A Haskell For A Great Good.
Очень хорошая книга для начинающих, Haskell в картинках. Весёлая и познавательная книга1
Hal Daume III. Yet Another Haskell Tutorial.
Ещё одна очень хорошая книга для начинающих. Без картинок, но всё по делу.
Paul Hudak. Haskell School of Expression.
Книга, которая иллюстрирует основные принципы функционального программирования на примере Haskell. Главные достоинства – много текста об общих принципах и интересные приложения, картинки, музыка, анимация, управление роботами и всё это на Haskell.
Paul Hudak. Haskell School of Music.
Пол Хьюдак увлекается не только Haskell, но и музыкой. Он написал книгу, которая целиком посвящена описанию музыки в Haskell:
Bryan O’Sullivan, Don Stewart, John Goerzen. Real World Haskell.
Очень полезная книга в помощь тем, кто хочет научиться писать настоящие, серьёзные программы. Авторы подробно изучают вопросы, связанные с применением Haskell на практике.
Готовится к выходу к книга Саймона Марлоу о параллельных вычислениях в Haskell. Обещает быть очень интересной, уже известно, что книга будет доступна в интернете.
John Hughes. Why Functional Programming Matters.
Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler. A History of Haskell: Being Lazy With Class.
Mark P. Jones. Functional Programming with Overloading and Higher-Order Polymorphism.
Евгений Кирпичев. Элементы функциональных языков программирования, журнал Практика функционального программирования.
Simon Thompson. Programming It in Haskell.
Justin Bailey. Haskell Cheat Sheet.
Conor McBride, Ross Paterson. Applicative programming with effects. Статья об аппликативных функторах.
Philip Wadler. The Essence of Functional Programming.
Статья, в которой впервые зашла речь о применении монад в Haskell.
Tarmo Uustalu, Varmo Vene. The Essence of Dataflow Programming.
Статья о комонадах, но есть много интересного и о монадах.
Bulat Ziganshin. Haskell I/O inside: Down the Rabbit’s Hole. Статья на HaskellWiki.
John Launchbury, Simon Peyton Jones. Lazy functional state threads.
Статья о типе ST
.
Simon Peyton Jones. Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell.
Douglas McIlroy. Power Series, Power Serious.
Дмитрий Астапов. Реурсия+мемоизация=динамическое программирование, журнал Практика функционального программирования.
Сергей Зефиров. Лень бояться, журнал Практика функционального программирования.
Jerzy Karczmarczuk. Specific “scientific” data structures, and their processing.
Graham Hutton. A tutorial on the universality and expressiveness of fold
Jeremy Gibbons. Origami Programming.
Jeremy Gibbons, Geraint Jones. The Under-Appreciated Unfold.
Шалак В.И. Шейнфинкель и комбинаторная логика.
Paul Hudak: Conception, Evolution, and Application of Functional Programming Languages.
Длинная статья о развитии функциональных языков. Там есть главы о лямбда-исчислении.
Бенджамин Пирс. Типы в языках программирования.
Большая книга о теории типов.
Денис Москвин. Системы типизации лямбда-исчисления.
Курс видео-лекций.
John Harrison. Introduction to Functional Programming.
Курс лекций по функциональному программированию, который читался в Университете Кэмбридж.
А. Филд, П. Харрисон, Функциональное программирование, Москва “Мир”, 1993.
Большая книга для читателей, всерьёз заинтересовавшихся функциональным программированием. Прочитав её, вы сможете не только пользоваться ФП-языками но и написать такой язык самостоятельно.
Rinus Plasmeijer and Marko van Eekelen. Functional Programming and Parallel Graph Rewriting.
В этой книге исследуются вопросы распараллеливания функциональных программ, построение компиляторов для функциональных языков.
Две очень хорошие книги для начинающих:
Maarten M. Fokkinga. Gentle Introduction to Category Theory.
Также где-то в сети есть и перевод на русский.
Steve Awodey. Category Theory.
Eugenia Cheng, Simon Willerton aka TheCatsters. Курс видео-лекций на youtube.
http://www.scss.tcd.ie/Edsko.de.Vries/ct/catsters/linear.php
Статьи по категориальным типам:
Varmo Vene. Categorical Programming with Inductive and Coinductive Types. Phd-диссертация.
Erik Meijer, Graham Hutton. Bananas in Space: Extending Fold and Unfold to Exponential Types.
Martin Erwig. Categorical Programming with Abstract Data Types.
Martin Erwig. Metamorphic Programming: Structured Recursion for Abstract Data Types.
Conal Elliott. Denotational design with type class morphisms.
Johan Tibell. High Performance Haskell. Слайды с выступления.
Johan Tibel. Faster persistent data structures through hashing. Слайды с выступления.
Simon Marlow. Parallel and Concurrent Programming in Haskell.
Edward Z. Yang. Блог о Haskell в картинках. Много полезной информации о лени и устройстве ghc. http://blog.ezyang.com/about/
Oleg Kiselyov. Блог в том числе и о Haskell. Много решений интересных и нетривиальных задач. http://okmij.org/ftp/
Документация GHC:
Don Stewart. Multi-paradigm Just-In-Time Compilation. BS Thesis, 2002.
Автор пробует компилировать Haskell-код в Java-код. При этом очень доступно объясняются внутренности STG.
Simon Marlow, Simon Peyton Jones. The Glasgow Haskell Compiler. The Architecture of Open Source Application, Volume 2, 2012.
Simon Marlow, Simon Peyton Jones. Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order Languages. ICFP’04.
Simon Peyton Jones. Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine.
Simon Marlow, Tim Harris, Roshan P. James, Simon Peyton Jones. Parallel Generational-Copying Garbage Collection with a Block-Structured Heap. ISMM’08.
Simon Peyton Jones, Andre Santos. A transformation-based optimizer for Haskell. Science of computer programming, 1998.
Simon Peyton Jones, John Launchbury. Unboxed values as first citizens in a non-strict functional programming language. 1991.
Simon Marlow, Simon Peyton Jones. Secrets of Glasgow Haskell Compiler inliner. 1999
Статья о тонкостях реализации прагмы INLINE
.
Simon Peyton Jones, Andrew Tolmach, Tony Hoare. Playing by the Rules, ICFP 2001
Статья о прагме RULES
.
Oleg Kiselyov. Implementing Explicit and Finding Implicit Sharing in EDSLs.
Чистое решение проблемы поиска дублирующих подвыражений.
Andy Gill. Type-Safe Observable Sharing in Haskell.
Решение проблемы поиска дублирующих подвыражений с помощью расширения GHC, позволяющего проводить сравнение термов по указателям.
Conal Elliott, Sigbjorn Finne, Oege de Moor. Compiling Embedded Languages.
Отчёт о построении EDSL для анимации.
Bruno C.d.S. Oliveira, Andres Loh. Abstract Syntax Graphs for Domain Specific Languages.
Применение графов для кодирования дублирующих подвыражений в EDSL.
Jacques Carette, Oleg Kiselyov and Chung-chieh Shan. Finally Tagless, Partially Evaluated. Tagless Staged Interpreters for Simpler Typed Languages.
Построение расширяемого синтаксиса с помощью классов типов.
Wouter Sweistra. Data types a la carte.
Построение расширяемых типов. В этой статье и выше под словом “расширяемый” понимается возможность добавления к типу новых конструкторов без перекомпиляции старых.
Если вдруг у вас возникли вопросы по Haskell, и рядом с вами не оказалось того, кто мог бы на них ответить, и в книгах нет ответа, вы можете спросить у сообщества Haskell, в haskell-cafe, там вам быстро и с радостью ответят:
Сообщество Haskell славится радушием и терпимостью к начинающим. Там много информации о выпусках новых библиотек, конференциях, обучающих программах и просто разговоры о том-о-сём.
Также стоит отметить журнал Monad.Reader:
Число пакетов, загруженных на Hackage, уже перевалило за 2000. В Hackage легко заблудиться. Очень часто не разберёшься какой из пакетов выбрать. К тому же многие из них заброшены или просто не подходят для использования в серьёзных приложениях. Но среди них есть и очень хорошие пакеты. Некоторые из них включены в Haskell Platform
. Ниже приведён тематический обзор наиболее популярных пакетов.
Все приведённые в этом подразделе библиотеки включены в Haskell Platform
.
Полный список библиотек для Haskell Platform
можно посмотреть на сайте http://lambda.haskell.org/hp-tmp/docs.
Начало-всех-начал: base
Библиотека включает в себя все стандартные определения, например модули Prelude
, Data.List
, Control.Monad
и многие другие.
Стандартные монады: transformers
, mtl
Включает монады State
, Writer
, Reader
и другие.
Контейнеры: containers
Ассоциативные массивы, множества, последовательности, деревья.
Массивы: array
Графы: fgl
Архиваторы: zlib
Вычисление по значению: deepseq
Обычная функция seq
, позволяет привести данное выражение к слабой заголовочной нормальной форме, если нам всё же необходимо вычислить значение полностью, мы можем воспользоваться функцией deepseq
из одноимённой библиотеки.
Параллельное программирование: stm
и parallel
Временная арифметика, календарь: time
Парсинг: parsec
Регулярные выражения: regex-base
, regex-posix
Построение структурированного текста: pretty
Тестирование программ: HUnit
, QuickCheck
Управление файловой системой: directory
Работа с путями к файлам/директориям: filepath
Сетевые библиотеки: network
, HTTP
, cgi
.
3д Графика: OpenGL
, GLUT
.
Монадные трансформеры: transformers
Мы не коснулись этой темы, но вот краткое пояснение: монадные трансформеры позволяют комбинировать несколько монад. Например, если нам нужно использовать чтение-запись в файл совместно с изменяемым состоянием.
Списки: dlist
– эффективное объединение списков.
Если вы часто пользуетесь операцией ++
, то необходимо заботиться о том, чтобы скобки всегда группировались вправо. Как в a++(b++(c++d))
. Иначе время объединения из линейного превратится в квадратичное. Библиотека dlist
предоставляет специальный тип списков, для которых не важно как группируются скобки при объединении. Время объединения всегда будет линейным.
Строки: bytestring
Если ваша программа загружена обработкой строк, и работает слишком медленно, рассмотрите вариант перехода со стандартных строк на тип ByteString
, это может увеличить быстродействие на порядок.
Текст: text
или utf8-string
Работа с текстом в формате Unicode. Часто проблемы возникают при необходимости обработки русского текста закодированного в Unicode. Для решения этой проблемы можно воспользоваться одной из этих библиотек.
Двоичные данные: binary
или cereal
– Сериализация/десериализация данных.
Случайные числа: mersenne-random-pure64
Эффективный генератор случайных чисел.
Ввод-вывод: iteratee
Эффективная реализация ввода-вывода. Если вам нужно читать или писать данные из большого числа файлов, эта библиотека может существенно помочь.
Контейнеры: unordered-containers
Альтернатива стандартной библиотеке containers
. Эффективные типы Map
и Set
.
Последовательности: fingertree
, seq
Используются для работы с очередями различного типа.
Массивы: vector
Эффективный тип для представления массивов. Замена стандартному типу Data.Array
.
Самые эффективные изменяемые хэш-таблицы: hashtables
Матрицы: hmatrix
, repa
Тестирование, проверка инвариантов: QuickCheck
Оценка быстродействия: criterion
Просмотр Core в человеческом виде: ghc-core
Настройка сборки мусора: ghc-gc-tune
Трассировка программ: hat
Парсинг: parsec
или attoparsec
Языки разметки: pandoc
, xhtml
, tagsoup
, blaze-html
, html
XML: xml
, HaXml
JSON: json
, aeson
Web: happstack
, snap
, yesod
, hakyll
Сетевые библиотеки: network
, HTTP
, cgi
, curl
Графика: diagrams
, gnuplot
, SDL
3д графика: OpenGL
, GLFW
, GLUT
Базы данных: HDBC
Встраиваемые приложения реального времени с жёсткими ограничениями: atom
GUI: wxHaskell
, gtk2hs
Оценка производительности программ: criterion
Статистика: statistics
Парсинг и генерация кода Haskell: haskell-src-exts
FRP: reactive
, reactive-banana
, yampa
Линейная алгебра: vector-space
, hmatrix
Где культивируется Haskell?
Посмотрим на университеты, в которых Haskell преподают, развивают и применяют:
Британия: Эдинбург, Ноттингем, Оксфорд (лаборатория информатики), Глазго.
Америка: Йельский, Коннектикут, Техас, Оклахома, Портлэнд, Канзас
Нидерланды: Утрехт
Швеция: Технологический Чалмерса, Гёттинген.
Австралия: Новый Южный Уэльс, Западной Австралии
и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_education.
Microsoft Research – разрабатывают GHC.
Galios – ведут исследования и решают практические задачи на ФП-языках, особенно на Haskell.
Well-Typed – решают практические задачи, консультируют и всё на Haskell. Также занимаются организацией Haskell-слётов, поддержкой стандартных библиотек.
и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_industry
Обновление: книга переведена на русский, вышла в издательстве ДМК Пресс.↩