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 () — это уже полноценная программа.

Проверьте себя
1. Что делает команда :type (или :t) в GHCi?
AУдаляет переменную
BПоказывает тип выражения
CЗапускает программу
DПереключает тему оформления
2. Какой тип у функции main в обычной программе?
AInt
BString
CIO ()
DBool