# Как познать Haskell Этот документ - рекомендованный путь к изучению языка Haskell, основанный на опыте помощи другим ## Это руководство доступно на других языках: * [In English](README.md) * [Auf Deutsch](guide-de.md) * [En Español](guide-es.md) * [En Français](guide-fr.md) * [In Italiano](guide-it.md) * [Em Português](guide-pt.md) * [繁體中文](guide-zh_tw.md) #### *Не страдайте над одним топиком, который вы не можете понять сразу*. Двигайтесь дальше! ## Сообщество IRC канал `#haskell-beginners` на Freenode. IRC веб-клиент [здесь](http://webchat.freenode.net/). [Почтовые рассылки](https://wiki.haskell.org/Mailing_lists). ### Политика сообщества [Смотрите пост про обучение от Криса Дона](http://chrisdone.com/posts/teaching) Будьте дружелюбны и вежливы. Грубость и хамство испугает собеседника и отталкнет от участия в общении. Слабая, неконструктивная критика удовлетворяет лишь критикующего, но не помогает критикуемому. Не описывайте вещи как "легкие" или "тривиальные". Вы заставляете людей чувствовать себя ужасно за то, что они усердно и много работают ради своего прогресса. Медленно-обучающиеся люди зачастую самые дотошные обучающиеся, этому наоборот надо радоваться! Не симулируйте удивление. Не изображайте удивление, когда кто-либо говорит, что он не знает что-то. Они будут чувствовать себя ужасно, а вы не получите ничего, кроме резкости. "ну, на самом деле". Когда кто-либо говорит что-то почти - но не совсем - верное, а вы говорите "ну, на самом деле..." и даете лишь мелкую правку. Это особенно раздражает, когда поправка не относится к основной теме разговора. Это не значит, что этот канал не про поиск правды или что нам все равно на точность. Просто почти все "ну, на самом деле" являются показухой, а не поиском правды. Не делайте всю работу за обучающегося. Если вы ввидите, что человек работает над проблемой, вы не должны немедлено выдавать советы или готовые решения. Дайте ему поработать и поизучать, пока он сам не попросит помощи. Избегать помех - [одна из основных причин существования #haskell-beginners](http://chrisdone.com/posts/teaching). Никаких -измов. Расизм, сексизм, гомофобия, трансофобия и другие виды фобий не приветствуются и не будут приняты терпимо. --- [Правила хорошего тона от Recurse Center](https://www.recurse.com/manual). Спасибо за их публикацию Recurse Center. # Что такое Haskell, GHC и Cabal? Haskell - это язык программирования, изложенный в спецификациях, последняя опубликована в 2010 году. Эта спецификация доступна как [онлайн-документ](http://www.haskell.org/onlinereport/haskell2010/). ## GHC [GHC](http://www.haskell.org/ghc/) - это самый популярный способ работы с языком Haskell. Он включает в себя компилятор, REPL (интерпритатор), пакетный менеджер и другие полезные вещи. ## Cabal [Cabal](https://www.haskell.org/cabal/download.html) осуществляет менеджмент проектов и разрешение зависимостей. Это способ установить проект, обычно в их песочницу (изолированное окружение). Cabal аналогичен Bundler в Ruby, pip в Python, NPM в Node и так далее. GHC управляет пакетами сам, Cabal решает какие версии устанавливать. # Установка Haskell ## НЕ УСТАНАВЛИВАЙТЕ HASKELL PLATFORM Вместо следования инструкциям на Haskell.org, смотри инструкции ниже, как установить GHC и Cabal. # Установка GHC и Cabal ## Ubuntu [Этот PPA](http://launchpad.net/~hvr/+archive/ghc) лучший и именно его я использую на всех моих серверах и локальных машинах с Linux. А именно: ```bash $ sudo apt-get update $ sudo apt-get install python-software-properties # v12.04 and below $ sudo apt-get install software-properties-common # v12.10 and above $ sudo add-apt-repository -y ppa:hvr/ghc $ sudo apt-get update $ sudo apt-get install cabal-install-1.22 ghc-7.8.4 happy-1.19.5 alex-3.1.4 ``` После этого, добавьте следующие пути к вашему `$PATH` (bash\_profile, zshrc, bashrc, и тп): ``` export PATH=$PATH:~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.8.4/bin:/opt/happy/1.19.5/bin:/opt/alex/3.1.4/bin ``` *Опционально:* вы можете добавить также `.cabal-sandbox/bin` к вашему пути. Код, который вы разрабатываете будет доступен вам из командной строки. Это работает только тогда, когда ваша текущая рабочая папка - песочница cabal. ## Debian ### Использование Ubuntu PPA Если вы не используете стабильный дистрибутив, вы можете повторить все теже шаги, что и для Ubuntu, но вам надо будет выполнить дополнительную команду. Сразу после `sudo add-apt-repository -y ppa:hvr/ghc` выполните: ```bash $ sudo sed -i s/jessie/trusty/g /etc/apt/sources.list.d/hvr-ghc-jessie.list ``` Для остальных версий Debian, просто замените все `jessie` именем вашей версии в команде выше. Если по какой-то причине файл `/etc/apt/sources.list.d/hvr-ghc-jessie.list` не существует, то `/etc/apt/sources.list` должен содержать строку со ссылкой вроде этой: deb http://ppa.launchpad.net/hvr/ghc/ubuntu jessie main Замените `jessie` на `trusty` в этой строке. ### Сборка из исходников Вы можете использовать [это руководство] (http://www.davesquared.net/2014/05/platformless-haskell.html), написанное для Mac OS X: Замечания: - Выставьте ваш префикс соответственно, когда конфигурируете ghc. - Вместо того, чтобы забирать бинарник `cabal-install`, скачайте исходный код и запустите скрипт `bootstrap.sh`. ## Fedora 21 Чтобы уставновить Haskell 7.8.4 из неофициального репо (Fedora 22+ будут содержать его в официальном): ```bash $ sudo yum-config-manager --add-repo \ > https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/repo/fedora-21/petersen-ghc-7.8.4-fedora-21.repo $ sudo yum install ghc cabal-install ``` Как указано на странице [petersen/ghc-7.8.4](https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/) этот ghc не может быть установлен вместе с Fedora/EPEL ghc. ## Arch Linux Чтобы установить Haskell из официального репо на Arch Linux, выполните: ```bash $ sudo pacman -S cabal-install ghc happy alex haddock ``` ## Gentoo На Gentoo вы можете установить индивидуальные компоненты Haskell Platform через Portage. Если вы используете `ACCEPT_KEYWORDS=arch` (вместо `ACCEPT_KEYWORDS=~arch`), Portage установит древние версии различных компонент Haskell. Помня это, если вы используете `ACCEPT_KEYWORDS=arch`, добавьте следующие строки в `/etc/portage/package.keywords`. dev-haskell/cabal-install dev-lang/ghc Как только это сделано, ```bash $ emerge -jav dev-lang/ghc dev-haskell/cabal-install ``` Gentoo хранит "стабильную" (читай "старую") версию `cabal-install` в дереве Portage, так что, если вы хотите использовать более современную версию `cabal-install`, выполните (заметтье, что слеши здесь нужны) ```bash $ \cabal update # Слеши здесь $ \cabal install cabal-install # нужны ``` Вы установили cabal глобально через Portage и локально в вашей домашней директории с `cabal-install`. Следующий шаг, это убедиться, что когда вы запускаете `cabal` в вашем терминале, ваша оболочка запускает последнюю версию в вашей домашней директории. Вам нужно добавить следующие строки к конфигурационному файлу вашей оболочки. ```bash PATH=$PATH:$HOME/.cabal/bin alias cabal="$HOME/.cabal/bin/cabal" ``` Если вы не знаете, какая оболочка у вас используется, то скорее всего это Bash. Если это Bash, то файл, в который вам надо добавлять эти строки - `~/.bashrc`. Если вы используете Z-shell, то это `~/.zshrc`. Вы можете понять, какая оболочка у вас используется, запустив: ```bash echo $SHELL | xargs basename ``` Я использую zsh, так что вывод этой команды у меня выглядит как `zsh`. После всего этого вы захотите установить дополнительные инструменты `alex` и `happy`. ```bash $ cabal install alex happy ``` Поздравляю! Теперь у вас рабочий Haskell! ## Mac OS X ### 10.9 Установите [GHC для Mac OS X](http://ghcformacosx.github.io/) приложение, которе включает в себя GHC и Cabal. Оно предоставляет инструкции, как добавить GHC и Cabal в ваш путь, после того как вы скопируете приложение `.app` куда-либо. ### 10.6-10.8 Выполните установку бинарников, которая описана ниже, для [этого архива](https://www.haskell.org/platform/download/2014.2.0.0/ghc-7.8.3-x86_64-apple-darwin-r3.tar.bz2). ## Windows - [Минимальный установщик GHC для Windows](http://neilmitchell.blogspot.com/2014/12/beta-testing-windows-minimal-ghc.html) способен скомпилировать `network` и тп. Технически, это бета версия, но должна работать для тех, кто читает это руководство. Не забудьте запустить установщик как администратор, так как он захочет установить файлы в Program Files. ## Пользователям других Linux дистрибутивов Скачайте последние бинарники cabal и ghc: - [GHC](http://www.haskell.org/ghc/). - [Cabal](https://www.haskell.org/cabal/download.html). ## Пользователям других Unix-подобных систем Скачайте GHC и Cabal из вашего пакетного менеджера, затем добавьте `~/.cabal/bin` в ваше `$PATH`. Поосле этого обновите `cabal` и установите дополнительные инструменты `alex` и `happy`. ```bash $ cabal update $ cabal install cabal-install alex happy ``` # Как я должен изучать Haskell? Основная рекомендация, это читать лекции и выполнять все упражнения/домашние задания для Spring 13 версии курса cis194. Затем то же для курса NICTA. На оба курса ссылки представлены ниже. Все остальное может быть рассмотрено как опциональное, и вы просто будете знать куда смотреть по определенной теме. ## Курс Yorgey cis194 > *Выполните его в первую очередь*, это лучший путь получить представление о Haskell Доступен [онлайн](http://www.seas.upenn.edu/~cis194/spring13/lectures.html). Курс от [Brent Yorgey](https://byorgey.wordpress.com), это лучшее, что я пока нашел. Этот курс ценен тем, что он не только научит вас писать базовый код на Haskell, но и также поможет вам понять комбинаторы парсера. Единственная причина, по которой вам не стоит начинать с курса cis194, это если вы не программист или вы неопытный программист. В этом случае, начинайте с [книги от Thompson](http://www.haskellcraft.com/craft3e/Home.html) и после этого уже курс cis194. --- ## Курс NICTA > Этот курс мы рекомендуем выполнять после курса Yorgey cis194. Доступен на Github [здесь](https://github.com/NICTA/course). Этот курс укрепит и добавит опыта реализации абстракций, представленых в курсе cis194. Эта практика *критически важна* для комфортного использования в дальнейшем таких абстракций как Functor/Applicative/Monad/и тп. в Haskell. Выполнение cis194 и затем NICTA курсов представляет собой основную рекомендацию моего руководства и того, как научить любого языку Haskell. --- ## Дополнительный курс после cis194 и NICTA > Предоставляет больше информации по продвинутым темам cs240h доступен [онлайн](http://www.scs.stanford.edu/14sp-cs240h/). Это онлайн курс от [Bryan O'Sullivan](https://github.com/bos), который он преподает в Стенфорде. Если вы не знаете кто он такой, взгляните на половину библиотек, от которых зависят все приложения на Haskell, и вы увидите его имя в их авторах. Если вы уже закончили курс Yorgey, особого внимания в этом курсе заслуживают разделы о фантомных типах, контроле потоков информации, расширениях языка, конкурентном выполнении, pipes и линзах. --- # Специфичные топики Haskell Эти источники не были проверены на учащихся так, как cis194 и NICTA, но с их помощью вы поймете с чего начинать изучение определенной темы. Они включают продвинутые и сложные темы и топики посвященные инструментам и текстовым редакторам. ## Диалоги > Хранятся в этом репозитории [здесь](dialogues.md). Они на самом деле достаточно важны и полезны. Просмотрите для погружения в некоторые из тем.