Haskell/GettingSetUp
В этом разделе объясняется как установить программы, необходимые для начала работы с Haskell.
Установка Haskell править
Haskell — это язык программирования, то есть такой язык, на котором люди могут выражать то, как должны работать компьютеры. Это очень похоже на написание кулинарного рецепта: вы пишете рецепт, а компьютер готовит по нему.
Прежде всего вам нужен компилятор Haskell. Компилятор — это программа, которая берёт исходный текст и переводит его в машинный код: второй, более примитивный язык, который могут понимать только компьютеры (вы тоже можете, но чтение машинного языка — крайне сложное занятие). Другой способ объяснить это: компилятор Haskell берёт ваш рецепт и создаёт по нему программу.
В любом случае, для того, чтобы начать изучать Haskell, загрузите и установите платформу Haskell. Она содержит «Glasgow Haskell Compiler» (или GHC), а также всё другое, что вам понадобится,
Небольшое примечание для тех, кто предпочитает собирать из исходников: возможно, это плохая идея, особенно, если вы устанавливаете GHC первый раз. GHC почти полностью написан на Haskell, так что пытаться собрать его вручную из исходников очень сложно. К тому же компиляция занимает очень много времени и требует очень много места на диске. Если же вы уверены в своём желании собрать GHC самостоятельно, то читайте Сборка и портирование GHC на официальной странице GHC.
Начинаем работу править
Рассмотрим GHCi, входящий в состав пакета GHC. Буква ‘i’ означает ‘interactive’ (англ. интерактивный), что и будет написано в заставке программы, когда вы её запустите. В командной строке (если вы работаете под Windows, кликните «Пуск», затем «Выполнить», наберите ‘cmd’ и нажмите клавишу Enter) наберите ghci и нажмите Enter.
На экране вы должны увидеть что-то похожее на это:
___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.6, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base . linking . done. Prelude>
Сначала идёт заставка GHCi, затем сообщение, что загружается пакет «base». Это означает, что вы сможете пользоваться встроенными модулями и функциями, которые идут вместе с GHC. И наконец, строка Prelude> , известная как «приглашение». Именно сюда надо вводить команды, а GHCi будет их вычислять.
Давайте попробуем выполнить простые арифметические операции:
Prelude> 2 + 2 4 Prelude> 5 * 4 + 3 23 Prelude> 2 ^ 5 32
Операторы означают то же, что и в других языках: + — сложение, * — умножение, и ^ — возведение в степень.
GHCi — очень мощная среда разработки. По ходу курса мы научимся загружать исходный код и вычислять различные его части.
В следующей главе мы изучим основные понятия Haskell и напишем свою первую функцию на Haskell.
Приготовимся
Мы не можем начать изучение языка без испытательного полигона. Установим Haskell.
Сделать это можно несколькими способами, мы выберем самый удобный. Называется он The Haskell Tool Stack. Эта маленькая утилита — всё, что вам понадобится для работы с Haskell.
Haskell — кроссплатформенный язык, работающий и в Linux, и в macOS OS X, и даже в Windows. Однако в 2008 году я навсегда покинул мир Windows, поэтому все последующие примеры взаимодействия с командной строкой подразумевают Unix-way. Впрочем, если вы всё-таки используете Windows, будьте уверены — всё описанное ниже заработает и у вас.
Вся конфигурация и примеры кода опробованы мною на Ubuntu 16.04.1.
Устанавливаем
Идём сюда и забираем нужную нам версию. Общий Unix-вариант установки предельно прост:
$ curl -sSL https://get.haskellstack.org/ | sh
Готово. После установки нам будет доступна команда stack , и она — наше всё.
На момент написания книги я использовал stack версии 1.4.0. Если у вас более старая версия — непременно обновитесь. Если же более новая — у вас что-нибудь может работать не совсем так, как описано ниже, поскольку stack всё ещё активно развивается.
Главное (но не единственное), что умеет делать stack , это:
- Разворачивать инфраструктуру.
- Собирать проекты.
- Устанавливать библиотеки.
Haskell-инфраструктура — экосистема, краеугольным камнем которой является ранее упомянутый компилятор GHC. Haskell является компилируемым языком: приложение представляет собой обыкновенный исполняемый (англ. executable) файл.
Haskell-проект — среда для создания приложений и библиотек.
Haskell-библиотеки — кем-то написанные решения, спасающие нас от изобретения велосипедов.
Разворачиваем инфраструктуру
$ stack setup
В результате на ваш компьютер будет установлена инфраструктура последней стабильной версии. Жить всё это хозяйство будет в только что созданном каталоге ~/.stack/ . Именно поэтому устанавливать инфраструктуру для последующих Haskell-проектов вам уже не придётся: единожды развернули, используем всегда. Пока вам не нужно знать об устройстве этой инфраструктуры, воспринимайте её как данность: теперь на вашем компьютере живёт Haskell.
Hi World
Создадим наш первый Haskell-проект:
$ stack new real
Здесь real — название проекта. В результате будет создан каталог real , внутри которого мы увидим это:
. ├── app │ └── Main.hs - Главный модуль программы ├── LICENSE ├── README.md ├── real.cabal - Сборочный конфиг проекта ├── Setup.hs ├── src │ └── Lib.hs - Ещё один модуль ├── stack.yaml - Конфиг Stack └── test └── Spec.hs - Тесты, они нам пока не нужны
Теперь переходим в каталог real и собираем проект командой:
$ stack build
Запомните эту команду, мы будем использовать её постоянно. В результате сборки появится файл real-exe . Располагается он внутри скрытого каталога .stack-work в корне проекта. Чтобы сразу его запустить, не копаясь во внутренностях этого скрытого каталога, используем команду:
$ stack exec real-exe someFunc
Команда stack exec запускает программу (в данном случае real-exe ) внутри stack -окружения. В одной из последующих глав я подробнее расскажу об этом окружении. Впрочем, мы можем запустить нашу программу и напрямую, без stack . Исполняемый файл real-exe находится внутри скрытого каталога .stack-work в корне проекта. Например, на моём компьютере путь к исполняемому файлу такой:
.stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/real-exe/real-exe
Но можно и упростить себе жизнь, выполнив команду:
$ stack install
В результате исполняемый файл будет скопирован в каталог ~/.local/bin (подразумевается, что такой каталог у вас уже имеется). Кстати, полезно добавить ~/.local/bin в PATH , что позволит вам тут же запускать программу:
$ real-exe someFunc
Вот мы и создали Haskell-проект и запустили нашу первую программу, выведшую строку someFunc . Но как же это работает? Пришла пора познакомиться с фундаментальной единицей проекта — модулем.
Модули: знакомство
Haskell-проект состоит из модулей. Модулем называется файл, содержащий исходный Haskell-код. Один файл — один модуль. Расширение .hs — стандартное расширения для модулей. В Haskell нет понятия «заголовочный файл»: каждый из модулей рассматривается как самостоятельная единица проекта, содержащая в себе разные полезные вещи. А чтобы воспользоваться этими вещами, необходимо один модуль импортировать в другой.
Откроем модуль src/Lib.hs :
module Lib -- Имя модуля ( someFunc -- Интерфейс модуля ) where -- Всё содержимое модуля - эта функция. someFunc :: IO () someFunc = putStrLn "someFunc"
В первой строке объявлено, что имя этого модуля — Lib . Далее в круглых скобках указан интерфейс данного модуля, то есть та его часть, которая видна всему миру. В данном случае это единственная функция someFunc , объявление и определение которой идёт далее, вслед за ключевым словом where . Пока вам не нужно знать о синтаксисе объявления и определений функции, в следующих главах мы разберём его тщательнейшим образом.
Теперь откроем модуль app/Main.hs :
module Main where import Lib -- Импортируем модуль Lib. main :: IO () main = someFunc -- Используем его содержимое.
Это модуль Main , главный модуль нашего приложения, ведь именно здесь определена функция main . С помощью директивы import мы включаем сюда модуль Lib и можем работать с содержимым этого модуля.
Запомните модуль Main , с ним мы будем работать чаще всего. Все примеры исходного кода, которые вы увидите на страницах этой книги, живут именно в модуле Main , если не оговорено иное.
Все модули в наших проектах можно разделить на две части: те, которые мы берём из библиотек и те, которые мы создали сами. Библиотеки — это уже кем-то написанные решения, в последующих главах мы познакомимся со многими из них. Среди библиотек следует выделить одну, так называемую стандартную библиотеку. Модули из стандартной библиотеки мы начнём использовать уже в ближайших главах. А одна из глав будет полностью посвящена рассказу о библиотеках: из неё мы подробно узнаем, откуда берутся библиотеки и как их можно использовать.
Для любопытных
До появления stack основным способом установки Haskell была так называемая Haskell Platform. Однако именно stack , несмотря на свою молодость (вышел в свет летом 2015 года), является предпочтительным путём в мир Haskell, особенно для новичков. Его настолько полюбили, что последние версии Haskell Platform включают в себя stack по умолчанию!
Как вы заметили, имена файлов с исходным кодом начинаются с большой буквы: app/Main.hs и src/Lib.hs . Строго говоря, это необязательно, можно и с маленькой буквы, однако для гармонии с именем модуля лучше придерживаться общепринятой практики и называть файл модуля по имени самого модуля:
app/Main.hs -> module Main . src/Lib.hs -> module Lib .
И ещё. При создании проекта мы могли бы использовать схему simple вместо предлагаемой по умолчанию. Для этого проект нужно было создать командой:
$ stack new real simple
где simple — имя схемы проекта. Дело в том, что команда stack new может создавать заготовки проектов для разных нужд. Простейшая из заготовок называется simple . В этом случае в проекте отсутствует модуль src/Lib.hs , а есть лишь src/Main.hs :
. ├── LICENSE ├── Setup.hs ├── real.cabal ├── src │ └── Main.hs - Единственный модуль └── stack.yaml
Да, мы могли бы воспользоваться данной схемой, однако в этом случае мы не увидели бы механизма импорта одного модуля в другой. Я рад, что вы познакомились с импортом уже сейчас, ведь в последующих главах мы будем постоянно использовать различные модули из многих библиотек.
Записки программиста
Устанавливаем самую свежую версию компилятора Haskell
В 99% случаев если вам требуется компилятор Haskell, то Haskell Platform решит все ваши проблемы. В платформу входит не только непосредственно стабильная версия компилятора GHC, но и такие утилиты, как cabal и haddock, а также некоторые часто используемые библиотеки. При этом с помощью cabal можно обновить, пожалуй, всю платформу, не считая разве что самого GHC. Но иногда хочется поиграться с версией GHC посвежее. Вот тому, как это сделать, и посвящена сия заметка.
Причин отказаться от стабильной и надежной версии GHC в пользу сырой и непроверенной может быть много. Кому-то просто хочется поиграться с новыми возможностями, кто-то желает проверить совместимость своих пакетов с грядущей версией компилятора, а кто-то, например, может надеяться увеличить производительность своего приложения, собрав его компилятором поновее. Есть и такие, кому просто нравится использовать все самое новое и собирать в связи с этим кучу граблей. Ну и, конечно же, не забудем самих разработчиков GHC, а также людей, решивших помочь с его бета-тестированием.
На момент написания этих строк стабильной версией GHC считается 7.6.3, а новой, уже почти готовой к релизу, но все еще допиливаемой — 7.8.1. Сначала мы попробуем установить бинарную сборку GHC 7.8.1, а затем рассмотрим сборку GHC из исходников. Я проделовал все написанное ниже под Ubuntu Linux, но подозреваю, что многое также будет справедливо в отношении других операционных систем и дистрибутивов Linux. Вся приведенная информация может сильно устареть к моменту, когда вы будете читать эти строки. Поэтому прежде, чем действовать, обязательно сверяйтесь с информацией в багтрекереах, файлами README, INSTALL и так далее.
Устновка последней бинарной сборки GHC
Бинарные сборки GHC для различных окружений доступны на официальном сайте языка. На момент написания этих строк самые свежие сборки были доступны по адресу:
https://www.haskell.org/ghc/dist/7.8.1-rc2/
Прежде, чем действовать, сносим платформу:
sudo apt-get remove haskell-platform
sudo apt-get autoremove
Затем — как-то так:
mkdir ~ / haskell
cd temp
wget https: // www.haskell.org / path / to / some / file.tar.bz2
tar -xvjf ghc-7.8.0.20140228-x86_64-unknown-linux-deb7.tar.bz2
cd ghc-7.8.0.20140228 /
. / configure —prefix = / home / eax / haskell
make install
В свой ~/.zshrc или ~/.bashrc дописываем:
export PATH = / home / eax / haskell / bin: $PATH
… и в консоли говорим:
source ~ / .zshrc
ghci
Если вдруг ghci ругается на то, что не может найти libgmp:
Loading package integer-gmp .
… просто даем ему libgmp:
sudo apt-get install libgmp-dev
В общем-то, это все. Самая свежая бинарная сборка GHC установлена!
Собираем Cabal
Очень грустно писать на Haskell без наличия под рукой cabal. Так давайте же самостоятельно соберем его из исходников! На багтрекере GHC есть замечание к GHC 7.8, что cabal нужно брать из репозитория на GitHub, а не с haskell.org, иначе он не соберется. Я проверил, действительно не собирается 🙂 Ну ОК, с гитхаба, так с гитхаба:
git clone https: // github.com / haskell / cabal.git
cd cabal / Cabal
Сначала собираем и устанавливаем библиотеку Cabal:
ghc -threaded —make Setup
. / Setup configure —user
. / Setup build
. / Setup install
Затем переходим к установке утилиты cabal, которая на самом деле cabal-install:
cd .. / cabal-install
. / bootstrap.sh
Утилита cabal зависит от некоторых сторонних пакетов, например, network, text и parsec. Скрипт bootstrap.sh тянет и собирает эти зависимости, затем собирает сам cabal.
Снова правим ~/.zshrc:
export PATH = / home / eax / .cabal / bin: $PATH
source ~ / .zshrc
cabal update
cabal install simple-genetic-algorithm
Если все было сделано правильно, пакет должен успешно установиться, после чего в ghci появится возможность подгрузить модуль GA.Simple и поиграться с ним. Поздравляю, теперь вам доступно более 5000 пакетов с Hackage!
Сборка GHC из исходников
И все-таки, бинарная сборка — это, можно сказать, прошлый век, ведь в ней нет самых-самых последних коммитов! Есть только один способ получить самый свежак, собрать GHC самостоятельно.
Для этого нам понадобятся кое-какие дополнительные инструменты:
sudo apt-get install autoconf automake libtool make \
ncurses-dev g++ llvm
Также нам понадобятся свежие версии Alex и Happy:
cabal update
cabal install alex happy
Клонируем git-репозиторий и делаем чекаут нужной ветки:
git clone http: // git.haskell.org / ghc.git
cd ghc
git checkout -b ghc- 7.8 origin / ghc- 7.8
Для удобства исходный код GHC разбит на несколько репозиториев. К сорсам прилагается скрипт sync-all. Это такой скрипт на Perl, который подтягивает зависимости GHC из других репозиториев. Что-то вроде самопального rebar из мира Erlang. Список зависимостей задается в файле packages, складываются зависимости в каталог libraries. Например, чтобы подтянуть все зависимости GHC 7.8, говорим:
. / sync-all get -b ghc- 7.8
Также с помощью sync-all разработчики GHC подтягивают новые патчи. Команда sync-all pull тянет все новые патчи из оригинального репозитория в дерево репозиториев в локальном каталоге.
Переходим к сборке:
mkdir ~ / ghc- 7.8 -2014mmdd
perl boot
. / configure —prefix = / home / eax / ghc- 7.8 -2014mmdd
make
Вновь лезем в ~/.zshrc, после всех ранее добавленных строчек пишем:
export PATH = / home / eax / ghc- 7.8 -2014mmdd / bin: $PATH
… чтобы путь к новому GHC оказался первым в списке $PATH. Потом говорим source . , ну вы уже поняли. Теперь у вас действительно самый свежак. Осталось разве что добавить задание в crontab, чтобы GHC автоматически пересобирался каждую ночь!
Заключение
- Тут пишут, что есть энтузиасты, поддерживающие PPA со свежими сборками GHC. Я проверял, не такие уж эти сборки и свежие, но может вам и такие норм;
- Недавно была опубликована занятная статья с обзором новых возможностях Haddock. В частности, документацию наконец-то можно писать на родном японском, и вообще любом юникоде;
- А тут можно найти много интересных сведений о том, как правильно тестировать GHC, как включить в нем опциональные возможности и тд;
- На Reddit обсуждаются причины задержки релиза GHC 7.8.1;
Как видите, ничего сложного. Вопросы и дополнения, как это было испокон веков, горячо приветсвуются!
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.
2.2. Installing on Windows
Getting the Glasgow Haskell Compiler (post 5.02) to run on Windows platforms is a snap: the Installshield does everything you need.
2.2.1. Installing GHC on Windows
To install GHC, use the following steps:
Download the Installshield setup.exe from the GHC download page haskell.org .
Run setup.exe . On Windows, all of GHC’s files are installed in a single directory. If you choose «Custom» from the list of install options, you will be given a choice about where this directory is; otherwise it will be installed in c:/ghc/ ghc-version . The executable binary for GHC will be installed in the bin/ sub-directory of the installation directory you choose.
(If you have already installed the same version of GHC, Installshield will offer to «modify», or «remove» GHC. Choose «remove»; then run setup.exe a second time. This time it should offer to install.)
When installation is complete, you should find GHCi and the GHC documentation are available in your Start menu under «Start/Programs/Glasgow Haskell Compiler».
The final dialogue box from the install process reminds you where the GHC binary has been installed (usually c:/ghc/ ghc-version /bin/ . If you want to invoke GHC from a command line, add this to your PATH environment variable.
GHC needs a directory in which to create, and later delete, temporary files. It uses the standard Windows procedure GetTempPath() to find a suitable directory. This procedure returns:
The path in environment variable TMP, if TMP is set.
Otherwise, the path in environment variable TEMP, if TEMP is set.
Otherwise, there is a per-user default which varies between versions of Windows. On NT and XP-ish versions, it might be: c:\Documents and Settings\\Local Settings\Temp
To test the fruits of your labour, try now to compile a simple Haskell program:
bash$ cat main.hs module Main(main) where main = putStrLn «Hello, world!» bash$ ghc -o main main.hs .. bash$ ./main Hello, world! bash$
You do not need the Cygwin toolchain, or anything else, to install and run GHC.
An installation of GHC requires about 140M of disk space. To run GHC comfortably, your machine should have at least 64M of memory.
2.2.2. Moving GHC around
At the moment, GHC installs in a fixed place ( c:/ghc/ghc-x.yy , but once it is installed, you can freely move the entire GHC tree just by copying the ghc-x.yy directory. (You may need to fix up the links in «Start/Programs/Glasgow Haskell Compiler» if you do this.)
It is OK to put GHC tree in a directory whose path involves spaces. However, don’t do this if you use want to use GHC with the Cygwin tools, because Cygwin can get confused when this happpens. We havn’t quite got to the bottom of this, but so far as we know it’s not a problem with GHC itself. Nevertheless, just to keep life simple we usually put GHC in a place with a space-free path.
2.2.3. Installing ghc-win32 FAQ
2.2.3.1. I’m having trouble with symlinks. 2.2.3.2. I’m getting “permission denied” messages from the rm or mv .
2.2.3.1. I’m having trouble with symlinks.
Symlinks only work under Cygwin ( Section 2.1.2.1 ), so binaries not linked to the Cygwin DLL, in particular those built for Mingwin, will not work with symlinks.
2.2.3.2. I’m getting “permission denied” messages from the rm or mv .
This can have various causes: trying to rename a directory when an Explorer window is open on it tends to fail. Closing the window generally cures the problem, but sometimes its cause is more mysterious, and logging off and back on or rebooting may be the quickest cure.
| Prev | Home | Next |
| Installing GHC | Up | The layout of installed files |