Haskell 23 — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(Проект)
(Проект)
Строка 89: Строка 89:
 
В качестве проекта предлагается доработать одно из домашних заданий следующим образом:
 
В качестве проекта предлагается доработать одно из домашних заданий следующим образом:
  
* Расширить функционал приложения, выполненного в домашнем задании (горизонт работ нужно обсудить со мной) (4 балла из 10);
+
<ul>
* Покрыть код тестами (2 балла из 10);
+
<li>Расширить функционал приложения, выполненного в домашнем задании (горизонт работ нужно обсудить со мной) (4 балла из 10);</li>
* Не использовать <code>unsafe</code>, если это не было обговорено заранее (2 балла из 10);
+
<li>Покрыть код тестами (2 балла из 10);</li>
* Проанализировать производительность приложения (1 балл из 10; 2 балла, если в проекте разрешён unsafe);
+
<li>Не использовать <code>unsafe</code>, если это не было обговорено заранее (2 балла из 10);</li>
* Поддерживать чистоту кода: предпочитать использовать готовые комбинаторы из стандартной библиотеки вместо явного паттерн-матчинга стандартных типов данных; предпочитать point-free стиль; неиспользованных импортов быть не должно; все неприменённые предложения линтера HLint должны быть откомментированы (1 балл из 10; 2 балла, если в проекте разрешён unsafe).
+
<li>Проанализировать производительность приложения (1 балл из 10; 2 балла, если в проекте разрешён unsafe);</li>
 +
<li>Поддерживать чистоту кода (1 балл из 10; 2 балла, если в проекте разрешён unsafe):
 +
  <ul>
 +
  <li>предпочитать использовать готовые комбинаторы из стандартной библиотеки вместо явного паттерн-матчинга стандартных типов данных;</li>
 +
  <li>предпочитать point-free стиль;</li>
 +
  <li>предпочитать пользоваться подсказками HLint;</li>
 +
  <li>неиспользованных импортов быть не должно;</li>
 +
  <li>если в проекте разрешён unsafe, он должен быть отделён от остального приложения какой-то безопасной абстракцией.</li>
 +
  </ul>
 +
</li>
 +
</ul>
  
 
Возможны групповые проекты. Также возможны инициативные темы. Они обсуждаются индивидуально, но разбалловка остаётся такой же.
 
Возможны групповые проекты. Также возможны инициативные темы. Они обсуждаются индивидуально, но разбалловка остаётся такой же.

Версия 13:45, 5 февраля 2023

Промышленное программирование на Haskell

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

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

Ссылки

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

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

Материалы курса: https://github.com/TurtlePU/haskell-2023

Записи лекций и семинаров: https://www.youtube.com/playlist?list=PLn8rjO6vyaY-UKMLisT-ncNhHufQ-_e_p

Таблица с оценками: https://docs.google.com/spreadsheets/d/1jBv9h6ZOsq8fSTbkB9Ug4D6LU6Ld8dz-9bKUh_IJumM/edit?usp=sharing

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 cabal recommended
    ghcup install hls recommended
  5. Убедитесь, что путь ~/.ghcup/bin содержится в $PATH. При необходимости добавьте этот путь сами.
  6. Создайте символические ссылки на установленные версии программ:
    ghcup set ghc recommended
    ghcup set cabal 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

План курса

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

  1. Лекция: начало курса; где используется Haskell. Семинар: рекап курса по Функциональному программированию.
  2. Лекция: окончание рекапа; введение в тестирование с помощью QuickCheck. Семинар: практика с QuickCheck; newtype pattern.
  3. Лекция: трансформеры монад; библиотека transformers. Семинар: паттерн tagless final; библиотека mtl.

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

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

Условия публикуются в репозитории курса.

  1. Повторение Haskell, введение в QuickCheck. До 8 февраля 23:59. Ссылка
  2. TBA
  3. TBA
  4. TBA

Проект

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

  • Расширить функционал приложения, выполненного в домашнем задании (горизонт работ нужно обсудить со мной) (4 балла из 10);
  • Покрыть код тестами (2 балла из 10);
  • Не использовать unsafe, если это не было обговорено заранее (2 балла из 10);
  • Проанализировать производительность приложения (1 балл из 10; 2 балла, если в проекте разрешён unsafe);
  • Поддерживать чистоту кода (1 балл из 10; 2 балла, если в проекте разрешён unsafe):
    • предпочитать использовать готовые комбинаторы из стандартной библиотеки вместо явного паттерн-матчинга стандартных типов данных;
    • предпочитать point-free стиль;
    • предпочитать пользоваться подсказками HLint;
    • неиспользованных импортов быть не должно;
    • если в проекте разрешён unsafe, он должен быть отделён от остального приложения какой-то безопасной абстракцией.

Возможны групповые проекты. Также возможны инициативные темы. Они обсуждаются индивидуально, но разбалловка остаётся такой же.

Проект должен быть оформлен в приватном репозитории на github, оценка выставляется за проект в том состоянии, в котором находилась default ветка репозитория (скорее всего main либо master) на воскресенье, 26 марта 2023, 23:59. Либо можно оформить сдачу в виде пулл-реквеста.

При необходимости во время весенней сессии для некоторых проектных работ потребуется защита для уточнения оценки.

Оценивание

Итог = Округление(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