Нужны компилятор GHC 9.10.3, система сборки cabal и make; для домашек на Haskell (с четвёртой недели) ещё линтер hlint.
Компилятор и cabal ставятся через ghcup одной командой.
Linux и macOS:
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | shНа Linux компилятору нужны системные библиотеки, и без них установка или первая сборка падает с ошибкой про gmp или tinfo. На Ubuntu и Debian поставьте их заранее:
sudo apt install build-essential curl libffi-dev libgmp-dev libncurses-dev pkg-configНа старых версиях Ubuntu дополнительно нужен libtinfo-dev. Fedora: sudo dnf install gcc gcc-c++ gmp gmp-devel make ncurses ncurses-devel xz perl; Arch и Manjaro: sudo pacman -S --needed base-devel gmp ncurses; openSUSE: sudo zypper install gcc gcc-c++ gmp-devel make ncurses-devel xz perl. Полный список — на странице установки ghcup. Если компилятор уже стоит, а первая сборка домашки падает с упоминанием terminfo или tinfo, не хватает именно ncurses-devel (libncurses-dev): его требует интерпретатор λ-термов.
Windows (PowerShell, команда с сайта ghcup):
Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; try { & ([ScriptBlock]::Create((Invoke-WebRequest https://www.haskell.org/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing))) -Interactive -DisableCurl } catch { Write-Error $_ }Установщик задаст вопросы: соглашайтесь поставить GHC и cabal, HLS (Haskell Language Server) — по желанию, он даёт подсказки в редакторе.
После установки откройте новый терминал и выберите версии по умолчанию, по одной команде на строку (в PowerShell && не работает):
ghcup install ghc 9.10.3 --set
ghcup install cabal recommended --setВерсия компилятора зафиксирована в cabal.project, поэтому другой компилятор сборка не примет. Вторая команда нужна, если cabal не находится или ghcup просит выбрать версию cabal по умолчанию: установщик иногда ставит cabal, но не назначает его текущим.
В домашках по λ-исчислению линтера нет: там нет кода на Haskell, и make check его не запускает. В домашках на Haskell линтер подсказывает, как упростить код. На статус задач его подсказки не влияют, но make check показывает их каждый раз, а ревью на них смотрит.
Быстрее всего взять готовый бинарник из релизов hlint (есть для Linux, macOS и Windows) и положить его в PATH; пакетный менеджер вашей системы тоже подойдёт. cabal install hlint работает, но собирает линтер из исходников долго.
Если hlint выдаёт ошибки на выданный вам код, обновите его (нужна версия не ниже 3.4.1).
Все команды домашки собраны в Makefile, make без аргументов печатает их список. На Linux и macOS make уже есть или ставится пакетным менеджером; на Windows он есть в оболочке MSYS2, которую устанавливает ghcup (pacman -S make).
Уровня три, и номер задачи начинается с её уровня:
1.x— обязательные задачи: домашка сдана, когда все они в статусе DONE;2.x— задачи, к которым стоит вернуться до очной сессии;3.x— челлендж для тех, кому мало.
Задачи лежат в src/: в домашках по λ-исчислению — один файл src/hw.lam, в домашках на Haskell — модули по уровням src/Level1.hs, src/Level2.hs, src/Level3.hs. Список задач с подписями — в файле TASKS в корне репозитория; некоторые задачи взаимозаменяемы: правило rule any k of: ... там означает, что из перечисленных достаточно закрыть любые k.
У каждой задачи после прогона тестов четыре возможных статуса: DONE (все тесты прошли), PARTIAL (часть прошла), FAILED (ничего не прошло) и TODO (вы к ней не приступали: на месте решения всё ещё заглушка todo или дырка ...). Баллов за задачи нет: важно только, закрыт ли уровень 1. Ровно это и означает цвет CI: зелёный — уровень 1 закрыт.
- Клонируйте свой репозиторий:
git clone git@github.com:.... - Соберите проект:
make build. Первый раз это долго, потому что собираются все зависимости. - Выполняйте задания в
src/. - Загружайте код в интерпретатор:
make repl. Для Haskell это GHCi со всеми уровнями домашки в области видимости, для λ-исчисления — интерпретатор λ-термов сsrc/hw.lam(прогулка по нему —lambda-engine/TUTORIAL.md).- После правок перезагружайте интерпретатор командой
:r. - Проверяйте решения вручную.
- После правок перезагружайте интерпретатор командой
- Запускайте
make check: тесты всех заданий (в Haskell-домашках перед ними линтер). В конце — таблица со статусом каждой задачи и вердикт по уровню 1. - Пока возитесь с одной задачей, тестируйте только её:
make check ONLY="1.1 1.2". - Отправляйте на автоматическую проверку:
make submit.
- Домашние задания спроектированы для решения «вручную», только в таком случае вы получите от них всю заложенную пользу. Если вы всё понимаете, домашние задания решаются очень быстро (по-настоящему быстро будет не сразу, это нормально).
- Придумывать решения, вспоминать детали и «тупить» гораздо эффективнее, чем прочитать решение — это даёт только иллюзию прогресса.
- Не сдавайте код, который не можете объяснить. Ничего не должно быть магией, в этом суть курса.
- AI может выполнять роль личного наставника и помогать учиться, это отличный инструмент. Но не используйте его как костыль для мозга — так вы ничему не научитесь и только потеряете время.
Не стесняйтесь обращаться за помощью к вашим преподавателям, они тут как раз для этого. Все контакты вы найдёте на вики. Нам не сложно и в радость вам помогать, а наблюдать молчаливое непонимание как раз грустно. Не обесценивайте свои трудности, ищите поддержки - и найдёте.
Также просите помощи у своих одногруппников, помогать интересно и полезно.
Если вы помогаете, не навредите! Предлагайте объяснения, а не ответы. Отталкивайтесь от потребностей собеседника, а не от желания показать себя. Человеку и так может быть не очень здорово, очень просто закопать его ещё глубже, говоря избыток умных слов и демонстрируя свою эрудицию.
Помните: у всех разная подготовка и способности к построению определённых видов умозрительных конструкций, с этим особо ничего не сделаешь. Но это никак вас не определяет. Чем сложнее даётся, тем ценнее любой шажок. Не будьте слишком требовательны к себе и двигайтесь в своём темпе. Всё будет хорошо, гарантируем.
Не всем просто психологически обращаться за помощью. Но это важно, без этого никак. Попробуйте относиться к этому как к части работы и постарайтесь, оно окупится.