Haskell 24

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

Промышленное программирование на Haskell, часть 1

Весенний курс по выбору для студентов 4 курса ФКН ВШЭ.

Команда курса

Лектор: Павел Соколов aka @TurtlePU.

Семинарист: Илья Костюченко aka @ilyakooo0.

Ассистент: Даниил Рубин aka @supremeSwings.

Ссылки

Канал в телеграм: https://t.me/+Is4I3YPaBWk3NjIy

Чат в телеграм: https://t.me/+lcim6Ukmojc5ZGUy

Материалы курса: https://github.com/Haskell-HSE

Записи лекций и семинаров: TBD

Таблица с оценками: TBD

Setting up

  1. Если вы пользуетесь Windows, установите WSL2, если ещё не.
  2. Установите 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 Powershell (cringe): Команда доступна по ссылке
  3. Убедитесь, что путь до места установки ghcup содержится в $PATH — запустите ghcup list.
  4. Установите recommended версии компилятора, системы сборки и языкового сервера:
    ghcup install ghc recommended
    ghcup install stack recommended
    ghcup install hls recommended
  5. Убедитесь, что путь ~/.ghcup/bin содержится в $PATH. При необходимости добавьте этот путь сами.
  6. Создайте символические ссылки на установленные версии программ:
    ghcup set ghc recommended
    ghcup set stack recommended
    ghcup set hls recommended
  7. Настройте LSP client в своей любимой среде разработки:
    • Для VS Code есть плагин. Настройка: TBD
    • В NeoVim настройте nvim-lspconfig, он знает про HLS.
    • Инструкцию для других сред можно найти здесь.
  8. Опционально — установите Hoogle локально:
    1. cabal install hoogle
    2. Допишите в файл ~/.ghci следующее:
      :def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\""
      :def hdoc \x -> return $ ":!hoogle --info \"" ++ x ++ "\""
    3. Теперь можно пользоваться Hoogle прямо из ghci с помощью команд :hoogle и :hdoc

План курса

Лекции, семинары

  • Лекция 05.02. Синтаксис. Ленивые вычисления. Типы данных. Классы типов. Конспект. [ Запись].
  • Лекция 12.02. Законы классов типов. Классы Semigroup, Monoid, Foldable, Functor, Applicative, Monad. Тестирование свойств. [ Конспект]. [ Запись].
  • Семинар 14.02. [ Материалы]. [ Запись].
  • Лекция 19.02. Примеры монад: Maybe, Either, Reader, Writer, State. Монада парсера. Класс Alternative. [ Конспект]. [ Запись].

Домашние задания

Практические задания по пройденным темам в виде мини-проектов stack. За каждое домашнее задание можно получить до 12 баллов.

  • Домашнее задание 1. Дедлайн 5 марта (вт) в 23:59.
  • [ Домашнее задание 2]. Дедлайн TBA.
  • [ Домашнее задание 3]. Дедлайн TBA.

Проект

В качестве проекта предлагается доработать одно из домашних заданий следующим образом:

  • Расширить функционал приложения, выполненного в домашнем задании (масштаб работ нужно обсудить с лектором либо с семинаристом) (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