GHC, GHCi и первый запуск
GHCi — это калькулятор для Haskell: пишете выражение, жмёте Enter, видите ответ. Лучшего способа учиться нет.
Не нужно компилировать целый проект, чтобы попробовать идею. Запустите GHCi, наберите выражение — и язык сразу покажет результат и тип.
Стандартный компилятор Haskell называется GHC (Glasgow Haskell Compiler), актуальная линейка — версии 9.x. Ставят его обычно через GHCup — менеджер, который скачивает GHC, систему сборки cabal и оболочку GHCi. Для учёбы достаточно онлайн-песочниц, но понимать инструменты полезно.
Внутри GHC живёт интерактивная оболочка GHCi. Это REPL: вы вводите выражение — оно вычисляется. Запускается командой:
ghci
После запуска появляется приглашение, и можно считать прямо в нём:
ghci> 2 + 3 * 4
14
ghci> "Привет, " ++ "мир"
"Привет, мир"
ghci> reverse [1,2,3]
[3,2,1]
Самые полезные команды
Команды GHCi начинаются с двоеточия. Две из них вы будете звать постоянно:
ghci> :type reverse
reverse :: [a] -> [a]
ghci> :info Bool
data Bool = False | True
ghci> :load Main.hs
ghci> :reload
Команда :type (коротко :t) показывает тип любого выражения — это главный инструмент изучения Haskell. :info рассказывает про тип или класс. :load загружает файл, :reload перечитывает его после правок, :quit выходит.
Первая программа в файле
Программы хранят в файлах .hs. Минимальная программа выглядит так:
main :: IO ()
main = putStrLn "Привет, Haskell!"
Функция main — точка входа. Тип IO () честно говорит: «здесь будут эффекты ввода-вывода». Запускают файл командой runghc Main.hs или компилируют в исполняемый файл через ghc Main.hs.
В нашей песочнице исполняется Python, поэтому ту же «первую программу» проще пощупать на нём — суть одинакова: печать строки.
# Та же идея на Python: точка входа и печать
def main():
print("Привет, Haskell!")
main()
Рабочий цикл новичка
Самый продуктивный способ учить Haskell — не читать, а пробовать. Откройте GHCi и держите его рядом постоянно: возникла гипотеза «а что вернёт эта функция?» — проверьте её за две секунды, не выходя из потока. Спрашивайте :t у всего подряд, даже у того, что кажется очевидным: типы рассказывают о функции больше, чем документация. Полезно знать ещё несколько команд: :browse показывает содержимое модуля, :set +t заставляет печатать тип каждого результата автоматически, а :doc в свежих версиях достаёт документацию прямо в оболочку. Когда работаете над файлом, держите цикл «правка — :reload — проверка» настолько коротким, насколько возможно: чем быстрее обратная связь, тем быстрее формируется интуиция. Этот режим «живого диалога с языком» — главная причина, по которой Haskell, вопреки репутации, осваивается куда легче, чем кажется со стороны.
Как это мыслить
Воспринимайте GHCi как лабораторию. Не уверены, что делает функция? Спросите её тип через :t. Не помните, как ведёт себя take? Просто вызовите take 3 [1..10] и посмотрите. Цикл «вопрос — мгновенный ответ» ускоряет обучение в разы.
Отдельно стоит сказать про режим работы с проектом: когда вы перерастёте отдельные файлы, GHCi запускают не напрямую, а через систему сборки командой cabal repl — тогда в оболочку подгружаются все ваши модули и зависимости разом. Это превращает GHCi в полноценную мастерскую: можно вызывать любые функции проекта, проверять их типы, прогонять кусочки логики вручную. Многие хаскелисты вообще держат cabal repl открытым всё время разработки и почти не запускают программу целиком, пока она в работе. Привыкайте к этому стилю с самого начала: интерактивность — не вспомогательный костыль для новичков, а штатный инструмент опытных разработчиков, который ускоряет цикл обратной связи на порядок.
Частые ошибки
- Забыть двоеточие у команд.
type— это попытка вычислить выражение, а:type— команда оболочки. - Писать определения в старом GHCi как в файле. В современных версиях
x = 5в GHCi работает, но многострочные определения удобнее держать в файле и:reload'ить. - Путать
ghcиghci. Первый компилирует, второй — интерактивен.
Best practices
- Держите GHCi открытым рядом с редактором: правите файл — жмёте
:reload. - Привыкайте спрашивать
:tу всего, что не до конца понимаете. - Начинайте проект через
cabal init— он создаст структуру и настройки за вас.
Итог. GHC — компилятор, GHCi — интерактивная оболочка для мгновенных экспериментов. Команды :type, :info, :reload — ваши лучшие друзья. Файл с функцией main :: IO () — это уже полноценная программа.