Haskell 23 — различия между версиями
TurtlePU (обсуждение | вклад) (Новая страница: «== Промышленное программирование на Haskell == Весенний курс по выбору для студентов 4 курса…») |
TurtlePU (обсуждение | вклад) (→Лекции, семинары) |
||
(не показаны 22 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
== Промышленное программирование на Haskell == | == Промышленное программирование на Haskell == | ||
− | Весенний курс по выбору для студентов 4 курса ФКН ВШЭ. | + | Весенний курс по выбору для студентов 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] — скачайте [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> — запустите <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>Опционально — установите [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
- Если вы пользуетесь Windows, установите WSL2, если ещё не.
-
Установите 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): Команда доступна по ссылке
- MacOS:
- Убедитесь, что путь до места установки
ghcup
содержится в$PATH
— запуститеghcup list
. -
Установите
recommended
версии компилятора, пакетного менеджера и языкового сервера:ghcup install ghc recommended ghcup install cabal recommended ghcup install hls recommended
- Убедитесь, что путь
~/.ghcup/bin
содержится в$PATH
. При необходимости добавьте этот путь сами. -
Создайте символические ссылки на установленные версии программ:
ghcup set ghc recommended ghcup set cabal recommended ghcup set hls recommended
-
Настройте LSP client в своей любимой среде разработки:
- Для VS Code есть плагин. Настройка: TBD
- В NeoVim настройте nvim-lspconfig, он знает про HLS.
- Инструкцию для других сред можно найти здесь.
- Опционально — установите Hoogle локально:
cabal install hoogle
-
Допишите в файл
~/.ghci
следующее::def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\"" :def hdoc \x -> return $ ":!hoogle --info \"" ++ x ++ "\""
- Теперь можно пользоваться Hoogle прямо из ghci с помощью команд
:hoogle
и:hdoc
План курса
Лекции, семинары
- Лекция: начало курса; где используется Haskell. Семинар: рекап курса по Функциональному программированию.
- Лекция: окончание рекапа; введение в тестирование с помощью QuickCheck. Семинар: практика с QuickCheck; newtype pattern.
- Лекция: трансформеры монад; библиотека transformers. Семинар: паттерн tagless final; библиотека mtl.
- Лекция: IORef и паттерн Handle; трансформер ReaderT и паттерн RIO. Семинар: Паттерн Has; IOArray; разбор юзкейса занятий 3-4.
- Лекция Многопоточность в Haskell: примитив par; синхронизация через MVar и Chan. Семинар Исключения в Haskell: синхронные исключения (в т.ч. в чистом коде); асинхронные исключения; bracket.
- Лекция Управление ресурсами в Haskell: bracket; ResourceT; разбор юзкейса (стриминг). Семинар: стриминг с помощью библиотеки conduit.
Домашние задания
Практические задания по пройденным темам в виде мини-проектов cabal. За каждое домашнее задание можно получить до 12 баллов.
Условия публикуются в репозитории курса.
- Повторение Haskell, введение в QuickCheck. До 8 февраля 23:59. Ссылка
- Трансформеры монад, tagless final, RIO. До 12 марта 23:59. Ссылка
- Nothing
- 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