Haskell 25
Содержание
[убрать]Промышленное программирование на Haskell
Весенний курс по выбору для студентов 4 курса ФКН ВШЭ.
Команда курса
Лектор: Павел Соколов aka @TurtlePU.
Семинарист: Илья Костюченко aka @ilyakooo0.
Ассистенты: Ислам Талипов aka @lishy2 и Глеб Смирнов aka @liferooter.
Ссылки
Канал в телеграм: https://t.me/+Is4I3YPaBWk3NjIy
Чат в телеграм: https://t.me/+lcim6Ukmojc5ZGUy
Конспекты лекций: https://github.com/Haskell-HSE/haskell-lectures-2025
Материалы семинаров: https://github.com/ilyakooo0/production-haskell
Записи лекций и семинаров: https://disk.yandex.ru/d/IoakBXz_6yygPw/%D0%9F%D1%80%D0%BE%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20Haskell
Таблица с оценками: https://docs.google.com/spreadsheets/d/19wFHBrf5e5x-5vtSdfq70tZAIMHW1bAy4kJki5TqWN4/edit?usp=sharing
Setting up
- Установка компилятора, системы сборки, языкового сервера
- (Рекомендованный способ) Через ghcup:
- Скачайте бинарный файл сами либо введите одну любимую команду:
- MacOS:
brew install ghcup
- Arch-based distros:
yay -S ghcup-hs-bin
- WSL2, MacOS >= 10.13, Linux:
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
- Windows: Команда доступна по ссылке.
- MacOS:
- Убедитесь, что путь до места установки
ghcup
(скорее всего,~/.ghcup/bin
либоC:/ghcup
) содержится в$PATH
— запуститеghcup list
. При необходимости добавьте этот путь сами. - Установите
recommended
версии компилятора, системы сборки и языкового сервера:-
ghcup install ghc recommended
-
ghcup install stack recommended
-
ghcup install hls recommended
-
- Создайте символические ссылки на установленные версии программ:
-
ghcup set ghc recommended
-
ghcup set stack recommended
-
ghcup set hls recommended
-
- Скачайте бинарный файл сами либо введите одну любимую команду:
- (Если предыдущий вариант не сработал) Windows:
-
choco install haskell-language-server haskell-stack
-
refreshenv
-
- (Рекомендованный способ) Через ghcup:
- Настройте LSP client в своей любимой среде разработки:
- Для VS Code есть плагин. Скорее всего, при запуске он предложит выбрать, каким образом ему находить HLS: через GHCup или вручную через PATH. Если устанавливали через
chocolatey
, выбирайте вторую опцию; иначе сначала попробуйте через GHCup. - В NeoVim настройте nvim-lspconfig, он знает про HLS.
- Инструкцию для других сред можно найти здесь.
- Для VS Code есть плагин. Скорее всего, при запуске он предложит выбрать, каким образом ему находить HLS: через GHCup или вручную через PATH. Если устанавливали через
- (Опционально) Установите Hoogle локально:
-
stack install hoogle
- Теперь можно пользоваться Hoogle прямо из ghci с помощью команды
:!hoogle
и:!hoogle --info
-
План курса
Лекции, семинары
- Лекция I (14 янв). Где и почему используют Haskell? Синтаксис. Ленивые вычисления. Конспект. Запись.
- Семинар I (15 янв). Stack. Типы данных. Материалы. Запись.
- Лекция II (21 янв). Сравнение с образцом. Композиция. Классы типов Eq, Ord, Num, Read, Show. Основы работы с IO. Конспект. Запись.
- Семинар II (22 янв). Сбалансированные деревья. Материалы. Запись.
- Лекция III (28 янв). Законы классов типов. Классы Semigroup, Monoid, Foldable, Functor, Applicative, Monad. Конспект. Запись.
- Семинар III (29 янв). Практика с моноидами. Материалы. Запись.
- Лекция IV (04 фев). Важнейшие примеры монад: Identity, Maybe, Either, State, IO. Конспект. Запись.
- Семинар IV (05 фев). Тестирование, основанное на свойствах. Консультация к ДЗ-1. [ Материалы]. Запись.
- Лекция V (11 фев). Парсинг как сайд-эффект. Комбинаторы парсеров. Классы Alternative и MonadPlus. Конспект. Запись.
- Семинар V (12 фев). Генераторы случайных чисел. Консультация к ДЗ-1. [ Материалы]. Запись.
- Лекция VI (18 фев). Композиция (аппликативных) функторов. Трансформеры монад. Конспект. Запись.
- Семинар VI (19 фев). TBA. [ Материалы]. [ Запись].
- Лекция VII (25 фев). Классы монад. Монада Free. Параметричность. Конспект. [ Запись].
- Семинар VII (26 фев). TBA. [ Материалы]. [ Запись].
- Лекция VIII (04 мар). TBA. [ Конспект]. [ Запись].
- Семинар VIII (05 мар). TBA. [ Материалы]. [ Запись].
- Лекция IX (11 мар). TBA. [ Конспект]. [ Запись].
- Семинар IX (12 мар). TBA. [ Материалы]. [ Запись].
- Лекция X (18 мар). TBA. [ Конспект]. [ Запись].
- Семинар X (19 мар). TBA. [ Материалы]. [ Запись].
Домашние задания
Практические задания по пройденным темам в виде мини-проектов stack. За каждое домашнее задание можно получить до 12 баллов.
- Домашнее задание 1. Дедлайн 21 февраля в 23:59.
- Домашнее задание 2 снимается. ОДЗ-2=max(ОДЗ-3, ОДЗ-4).
- Домашнее задание 3. Дедлайн 16 марта в 23:59.
- Домашнее задание 4. Дедлайн 23 марта в 23:59.
Проект
В качестве проекта предлагается доработать одно из домашних заданий следующим образом:
- Расширить функционал приложения, выполненного в домашнем задании (масштаб работ нужно обсудить с лектором либо с семинаристом) (4 балла из 10);
- Покрыть код тестами (2 балла из 10);
- Не использовать
unsafe
, если это не было обговорено заранее (2 балла из 10); - Проанализировать производительность приложения (1 балл из 10; 2 балла, если в проекте разрешён unsafe);
- Поддерживать чистоту кода (1 балл из 10; 2 балла, если в проекте разрешён unsafe):
- предпочитать использовать готовые комбинаторы из стандартной библиотеки вместо явного паттерн-матчинга стандартных типов данных;
- предпочитать point-free стиль, где это разумно;
- предпочитать пользоваться подсказками HLint;
- код должен быть консистентно отформатирован, неиспользованных импортов быть не должно;
- если в проекте разрешён unsafe, он должен быть отделён от остального приложения какой-то безопасной абстракцией.
Возможны групповые проекты. Также возможны инициативные темы; они обсуждаются индивидуально, но разбалловка остаётся такой же.
Проект должен быть оформлен в приватном репозитории на github. Оценка выставляется за проект в том состоянии, в котором находилась default ветка репозитория (скорее всего main либо master) в полночь перед защитой. Либо можно оформить сдачу в виде пулл-реквеста.
Защита проекта проводится во время весенней сессии.
Оценивание
Итог = Округление(min(10, 0.64 * ДЗ + 0.36 * ПР)),
где ДЗ – средняя оценка за все домашние задания, ПР – оценка за проектную работу.
Округление арифметическое.
Дополнительная литература
- Will Kurt – Get Programming with Haskell
- Bryan O'Sullivan, Don Stewart, John Goerzen – Real World Haskell
- Alexander Granin – Functional Design and Architecture
- Sandy Maguire – Algebra-Driven Design