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

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(Новая страница: «== Промышленное программирование на Haskell == Весенний курс по выбору для студентов 4 курса…»)
 
(Лекции, семинары)
 
(не показаны 22 промежуточные версии этого же участника)
Строка 1: Строка 1:
 
== Промышленное программирование на Haskell ==
 
== Промышленное программирование на Haskell ==
  
Весенний курс по выбору для студентов 4 курса ФКН ВШЭ. Ссылка на чат в телеграм: https://t.me/+lcim6Ukmojc5ZGUy.
+
Весенний курс по выбору для студентов 4 курса ФКН ВШЭ.
 
+
== Преподаватели ==
+
  
 
Лектор и семинарист: Павел Соколов aka [https://t.me/TurtlePU @TurtlePU].
 
Лектор и семинарист: Павел Соколов aka [https://t.me/TurtlePU @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 ==
 +
 +
<ol>
 +
  <li>Если вы пользуетесь Windows, установите WSL2, если ещё не.</li>
 +
  <li>
 +
    Установите [https://www.haskell.org/ghcup/ ghcup] &mdash; скачайте [https://downloads.haskell.org/~ghcup/ бинарный файл] сами
 +
    либо введите одну любимую команду:
 +
    <ul>
 +
      <li> '''MacOS''': <pre>brew install ghcup</pre></li>
 +
      <li> '''Arch'''-based distros: <pre>yay -S ghcup-hs-bin</pre></li>
 +
      <li> '''WSL2''', '''MacOS''' >= 10.13, '''Linux''': <pre>curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh</pre></li>
 +
      <li> '''Windows Powershell''' (cringe): Команда доступна по [https://www.haskell.org/ghcup/install/#installation ссылке]</li>
 +
    </ul>
 +
  </li>
 +
  <li>Убедитесь, что путь до места установки <code>ghcup</code> содержится в <code>$PATH</code> &mdash; запустите <code>ghcup list</code>.</li>
 +
  <li>
 +
    Установите '''<code style="background-color:black;color:rgb(0,255,0)">recommended</code>''' версии компилятора, пакетного менеджера и языкового сервера:<pre>
 +
ghcup install ghc recommended
 +
ghcup install cabal recommended
 +
ghcup install hls recommended</pre>
 +
  </li>
 +
  <li>Убедитесь, что путь <code>~/.ghcup/bin</code> содержится в <code>$PATH</code>. При необходимости добавьте этот путь сами.</li>
 +
  <li>
 +
    Создайте символические ссылки на установленные версии программ:<pre>
 +
ghcup set ghc recommended
 +
ghcup set cabal recommended
 +
ghcup set hls recommended</pre>
 +
  </li>
 +
  <li>
 +
    Настройте LSP client в своей любимой среде разработки:
 +
    <ul>
 +
      <li>Для '''VS Code''' есть [https://github.com/haskell/vscode-haskell плагин]. Настройка: TBD</li>
 +
      <li>В '''NeoVim''' настройте [https://github.com/neovim/nvim-lspconfig nvim-lspconfig], он знает про HLS.</li>
 +
      <li>Инструкцию для других сред можно найти [https://haskell-language-server.readthedocs.io/en/latest/configuration.html#configuring-your-editor здесь].</li>
 +
    </ul>
 +
  </li>
 +
  <li>Опционально &mdash; установите [https://hoogle.haskell.org Hoogle] локально:
 +
    <ol>
 +
      <li><code>cabal install hoogle</code></li>
 +
      <li>
 +
        Допишите в файл <code>~/.ghci</code> следующее:<pre>
 +
:def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\""
 +
:def hdoc \x -> return $ ":!hoogle --info \"" ++ x ++ "\""</pre>
 +
      </li>
 +
      <li>Теперь можно пользоваться Hoogle прямо из ghci с помощью команд <code>:hoogle</code> и <code>:hdoc</code></li>
 +
    </ol>
 +
  </li>
 +
</ol>
 +
 +
== План курса ==
 +
 +
=== Лекции, семинары ===
 +
 +
# [https://youtu.be/uLKF3g4SaVw Лекция]: начало курса; где используется Haskell. [https://youtu.be/vGa5U2XpXWQ Семинар]: рекап курса по Функциональному программированию.
 +
# [https://youtu.be/7646Pfpu8Hk Лекция]: окончание рекапа; введение в тестирование с помощью QuickCheck. [https://youtu.be/Z5WFM7YofBo Семинар]: практика с QuickCheck; newtype pattern.
 +
# [https://youtu.be/vPh0yTI9L98 Лекция]: трансформеры монад; библиотека transformers. [https://youtu.be/gnSXCxsjRmc Семинар]: паттерн tagless final; библиотека mtl.
 +
# [https://youtu.be/cJL3-WmAmrk Лекция]: IORef и паттерн Handle; трансформер ReaderT и паттерн RIO. [https://youtu.be/QbhuFbna5Xc Семинар]: Паттерн Has; IOArray; разбор юзкейса занятий 3-4.
 +
# [https://youtu.be/W0CQTzOZNLY Лекция] '''Многопоточность в Haskell''': примитив par; синхронизация через MVar и Chan. [https://youtu.be/mVaMDU-aCjs Семинар] '''Исключения в Haskell''': синхронные исключения (в т.ч. в чистом коде); асинхронные исключения; bracket.
 +
# [https://youtu.be/CS5Fh1Faczs Лекция] '''Управление ресурсами в Haskell''': bracket; ResourceT; разбор юзкейса (стриминг). [https://youtu.be/nft63JtubxU Семинар]: стриминг с помощью библиотеки conduit.
 +
 +
=== Домашние задания ===
 +
 +
Практические задания по пройденным темам в виде мини-проектов cabal. За каждое домашнее задание можно получить до 12 баллов.
 +
 +
Условия публикуются в [https://github.com/TurtlePU/haskell-2023 репозитории курса].
 +
 +
# Повторение Haskell, введение в QuickCheck. До 8 февраля 23:59. [https://github.com/TurtlePU/haskell-2023/tree/main/hw-quickcheck Ссылка]
 +
# Трансформеры монад, tagless final, RIO. До 12 марта 23:59. [https://github.com/TurtlePU/haskell-2023/tree/main/hw-effects Ссылка]
 +
# Nothing
 +
# Free Monad, DSL, рекурсия. До 1 апреля 23:59. [https://github.com/TurtlePU/haskell-2023/tree/main/hw-spreadsheet Ссылка]
 +
 +
=== Проект ===
 +
 +
В качестве проекта предлагается доработать одно из домашних заданий следующим образом:
 +
 +
<ul>
 +
<li>Расширить функционал приложения, выполненного в домашнем задании (масштаб работ нужно обсудить со мной) (4 балла из 10);</li>
 +
<li>Покрыть код тестами (2 балла из 10);</li>
 +
<li>Не использовать <code>unsafe</code>, если это не было обговорено заранее (2 балла из 10);</li>
 +
<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>
 +
 +
Возможны групповые проекты. Также возможны инициативные темы; они обсуждаются индивидуально, но разбалловка остаётся такой же.
 +
 +
Проект должен быть оформлен в приватном репозитории на 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

Текущая версия на 14:48, 21 марта 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.
  4. Лекция: IORef и паттерн Handle; трансформер ReaderT и паттерн RIO. Семинар: Паттерн Has; IOArray; разбор юзкейса занятий 3-4.
  5. Лекция Многопоточность в Haskell: примитив par; синхронизация через MVar и Chan. Семинар Исключения в Haskell: синхронные исключения (в т.ч. в чистом коде); асинхронные исключения; bracket.
  6. Лекция Управление ресурсами в Haskell: bracket; ResourceT; разбор юзкейса (стриминг). Семинар: стриминг с помощью библиотеки conduit.

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

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

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

  1. Повторение Haskell, введение в QuickCheck. До 8 февраля 23:59. Ссылка
  2. Трансформеры монад, tagless final, RIO. До 12 марта 23:59. Ссылка
  3. Nothing
  4. Free Monad, DSL, рекурсия. До 1 апреля 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