Функциональное программирование 23-24 — различия между версиями
TurtlePU (обсуждение | вклад) (→Домашние задания) |
TurtlePU (обсуждение | вклад) (→Полезные библиотеки) |
||
(не показано 5 промежуточных версии 2 участников) | |||
Строка 83: | Строка 83: | ||
| [https://drive.google.com/file/d/1MBSr_Ryb9Xw7HxYUU1vC6WfMHF_YJh9f/view?usp=sharing ДЗ 1] || 13.10 23:59 | | [https://drive.google.com/file/d/1MBSr_Ryb9Xw7HxYUU1vC6WfMHF_YJh9f/view?usp=sharing ДЗ 1] || 13.10 23:59 | ||
|- | |- | ||
− | | [https://drive.google.com/file/d/1IK0SZGj78veayMS6_1BS7lT9HncbNwTY/view?usp=drive_link Д3 2] || 23. | + | | [https://drive.google.com/file/d/1IK0SZGj78veayMS6_1BS7lT9HncbNwTY/view?usp=drive_link Д3 2] || 01.11 23:59 |
+ | |- | ||
+ | | [https://drive.google.com/file/d/1UuZWdkEQsKpS1xDVXK1WqOy1tWP1KlJC/view?usp=drive_link ДЗ 3] || 30.11 | ||
+ | |- | ||
+ | | [https://drive.google.com/file/d/13XvUC48ga4xjTPbVl1isVI0GIxFT0Y_u/view?usp=drive_link ДЗ 4] || 11.12 | ||
+ | |- | ||
+ | | [https://drive.google.com/file/d/14On7LzhyaasXiKm619EtKy7lqD_g9SF1/view?usp=drive_link ДЗ 5] || 20.12 | ||
|} | |} | ||
Строка 101: | Строка 107: | ||
== Индивидуальный проект == | == Индивидуальный проект == | ||
− | При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы за день до защиты (до 23:59), то есть как минимум до | + | При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы за день до защиты (до 23:59), то есть как минимум до 20 декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла. |
==== Некоторые темы для проектов ==== | ==== Некоторые темы для проектов ==== | ||
Строка 173: | Строка 179: | ||
* <code>monoidal-containers</code> — некоторые стандартные коллекции с в каком-то смысле более правильными инстансами <code>Semigroup</code> и <code>Monoid</code>. | * <code>monoidal-containers</code> — некоторые стандартные коллекции с в каком-то смысле более правильными инстансами <code>Semigroup</code> и <code>Monoid</code>. | ||
* <code>lattices</code> — решётки (алгебраическая структура). | * <code>lattices</code> — решётки (алгебраическая структура). | ||
+ | * <code>brick</code> — фреймворк для TUI интерфейсов. | ||
* <code>servant</code> — генератор API для веб-серверов и клиентов. | * <code>servant</code> — генератор API для веб-серверов и клиентов. | ||
* <code>telegram-bot-simple</code> — немного устаревшая библиотека для ботов в Телеграм. | * <code>telegram-bot-simple</code> — немного устаревшая библиотека для ботов в Телеграм. |
Текущая версия на 12:14, 12 декабря 2023
Содержание
- 1 Функциональное программирование
- 2 Преподаватели
- 3 Текущая успеваемость
- 4 Setting up
- 5 Листки и код для семинаров
- 6 Домашние задания
- 7 Контрольная работа
- 8 Итоговый экзамен
- 9 Индивидуальный проект
- 9.1 Некоторые темы для проектов
- 9.2 Частые Вопросы по проектам
- 9.2.1 Какой сложности и объёма должен быть проект?
- 9.2.2 Можно ли брать одну и ту же тему проекта?
- 9.2.3 Можно ли выбирать тему, не предложенную преподавателями?
- 9.2.4 Как аппрувнуть тему?
- 9.2.5 Оценивается ли кодстайл?
- 9.2.6 Нужна ли документация проекта?
- 9.2.7 В какой форме можно сдать код проекта?
- 9.2.8 Какой дедлайн сдачи проекта?
- 9.2.9 Будут ли дополнительные вопросы на понимание кода проекта?
- 9.2.10 За что производится оценивание проекта?
- 9.2.11 Как проходит защита?
- 9.3 Полезные библиотеки
- 10 Материалы
- 11 Оценки
Функциональное программирование
Курс по выбору для студентов 3 и 4 курса ФКН ВШЭ, 1 и 2 модуль 2023 г. Функциональное программирование (ФП) представляет собой теоретически изящный, выдержавший проверку временем на практике и оказавший заметное влияние на технологии программирования вообще подход к созданию ПО. Курс посвящен основам ФП в целом и популярного языка Haskell в частности. Попутно сообщаются начальные сведения из области лямбда-исчислений, теории типов, теории категорий.
Преподаватели
Лектор и семинарист: Евгений Дашков, ТГ: @edashkov, edashkov@gmail.com.
Семинарист: Павел Соколов, ТГ: @TurtlePU.
Учебный ассистент: Максим Чурилов, ТГ: @maxchrlv.
Текущая успеваемость
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 есть плагин, он должен обнаружить HLS самостоятельно.
- В 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
Листки и код для семинаров
- Лекции и семинары Е. Дашкова в 22/23 учебном году
Домашние задания
Домашние задания выдаются приблизительно раз в две недели; при выдаче каждого задания указывается срок его сдачи. Все задания письменные. Каждая задача оценивается 0, ½ или 1 баллом. Все задания в целом оцениваются числом:
ДЗ = (сумма полученных баллов за все задачи) / (количество выданных задач без *).
Набор задач | Срок сдачи | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ДЗ 1 | 13.10 23:59 | ||||||||||
Д3 2 | 01.11 23:59 | ||||||||||
ДЗ 3 | 30.11 | ||||||||||
ДЗ 4 | 11.12 | ||||||||||
ДЗ 5 | 20.12 |
Срок сдачи задания устанавливается семинаристом группы.
Сдавать решения нужно в Classroom.
Контрольная работа
Письменная Контрольная работа проводится в начале второго модуля. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается 0, ½ или 1 баллом. Контрольная оцениваются числом:
КР = (сумма полученных баллов за все задачи) / (количество выданных задач).
Итоговый экзамен
Письменный экзамен проводится в конце курса. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается 0, ¼, ½ , ¾ или 1 баллом. Экзамен оценивается числом:
Э = (сумма полученных баллов за все задачи) / (количество выданных задач).
Индивидуальный проект
При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы за день до защиты (до 23:59), то есть как минимум до 20 декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла.
Некоторые темы для проектов
Варианты от Евгения Владимировича:
- Определить кольцо Z[X1, X2, ...] многочленов над Z c произвольным количеством переменных. Должны поддерживаться методы show, +, -, *, а также операции подстановки одного многочлена в другой (в частности, вычисление значения в целых точках) и дифференцирования по произвольной переменной.
- Определить понятие формулы первого порядка (в заданной сигнатуре) и реализовать алгоритм приведения таких формул к предваренной нормальной форме.
- Определить понятие пропозициональной формулы и реализовать проверку таких формул на выполнимость с помощью метода резолюций. Метод применим только к КНФ, поэтому еще нужно реализовать полиномиальный алгоритм построения КНФ, «равновыполнимой» данной формуле.
- Реализуйте «угадывающую машину» К. Шеннона.
- Вычислите справедливую стоимость опциона методом "двоичного дерева".
- Реализуйте игру "Жизнь" на торе с графикой ASCII
Варианты от Паши:
- DSL для rich text-а (а-ля Markdown, возможно, с поддержкой формул)
- Библиотека для простых символьных вычислений (с упрощением выражений)
- Бот в телеграм с помощью servant
- Model checker для простых моделей и формул (с нуля)
- Автоматическое дифференцирование, линейная регрессия на его основе (с нуля)
- Консольный роглайк
- Интерпретатор Scheme
- Улучшение интерпретатора лямбда-исчисления
Варианты инициативных проектов от некоторых студентов:
- Решение задач на Codeforces на Haskell
- Crafting Interpreters на Haskell
- Криптографическая библиотека
- Raft с нуля
- Консольный мессенджер
Частые Вопросы по проектам
Какой сложности и объёма должен быть проект?
Зависит от Вашего уровня. Подбирайте задачу, которую Вам самим интересно решать и которую Вы успеете доделать (или сделать осмысленный кусок) к дедлайну.
Можно ли брать одну и ту же тему проекта?
Да, можно, главное, чтобы проекты выполнялись самостоятельно. Обмениваться идеями можно, копировать код друг у друга — нет.
Можно ли выбирать тему, не предложенную преподавателями?
Да, можно, темы выше — это примерные ориентиры для вдохновения. Можно взять их, можно придумать что-то своё.
Как аппрувнуть тему?
Связываетесь со мной (Павлом), я оцениваю совместимость уровня студента до начала прохождения курса и сложности проекта и говорю, подходит ли Вам тема или нужно её отрафинировать.
Оценивается ли кодстайл?
Типы всех верхнеуровневых функций должны быть выписаны явно, а пользовательские типы и конструкторы должны иметь понятные, семантические названия. Отступы, именования локальных переменных и т.д. не проверяются.
Нужна ли документация проекта?
Haddock не обязателен, но см. комментарий про типы выше
В какой форме можно сдать код проекта?
В любом формате, который не предполагает нахождение вашего кода в открытом доступе и который желающие потом смогут собрать с помощью cabal build и запустить с помощью cabal run. При этом ограничений на версию GHC нет.
Какой дедлайн сдачи проекта?
С выбором темы желательно определиться до начала сессии, защита будет когда-то во время сессии, возможно, в несколько дней. Код нужно прислать за день (до 23:59) до начала Вашей защиты.
Будут ли дополнительные вопросы на понимание кода проекта?
Только в том случае, если мы начнём сомневаться в авторстве проекта.
За что производится оценивание проекта?
За навык решения не-тривиальной задачи на Haskell. Если вы решили ощутимую часть задачи, одобренной мной (Павлом), то это полный балл. Опять же, оценивание зависит от Вашего начального уровня до прохождения курса.
Как проходит защита?
Скорее всего онлайн. Вы рассказываете, какая у Вас тема, что Вы успели сделать, как устроен код (с высоты птичьего полёта, только основные типы данных, функции и инстансы). Мы можем задать Вам пару вопросов по задаче, возможным расширениям и архитектуре решения. Можно слушать защиты друг друга и задавать свои вопросы, групповые проекты защищаются всей командой сразу.
Полезные библиотеки
-
containers
,unordered-containers
— стандартные коллекции. -
monoidal-containers
— некоторые стандартные коллекции с в каком-то смысле более правильными инстансамиSemigroup
иMonoid
. -
lattices
— решётки (алгебраическая структура). -
brick
— фреймворк для TUI интерфейсов. -
servant
— генератор API для веб-серверов и клиентов. -
telegram-bot-simple
— немного устаревшая библиотека для ботов в Телеграм. -
haskeline
— фреймворк для REPL интерфейсов. -
ansi-terminal
— для редактирования вывода (полезно для роглайков и Game of Life). -
megaparsec
— фреймворк для написания парсеров. -
async
— асинхронное IO. -
data-fix
,free
— типы данных для обобщённой рекурсии. -
QuickCheck
— фреймворк для property-based тестирования. -
HUnit
— фреймворк для юнит-тестов.
Материалы
Записи лекций Е. В. Дашкова в МФТИ
Базовые ресурсы
Стандартная библиотека языка Haskell на Hackage
Книги и статьи
Learn You a Haskell for Great Good
Lectures on the Curry-Howard Isomorphism
Purely Functional Data Structures.
Нет в открытом доступе
Programming in Haskell by Graham Hutton
Basic Category Theory for Computer Scientists by Benjamin C. Pierce
Оценки
Итоговая оценка получается так:
Итог = ОКРУГЛ (2 * ПР + 2 * КР + 3 * ДЗ + 3 * Э).
Округление производится к ближайшему целому, притом что полуцелые значения округляются вверх.