Функциональное программирование 22-23 — различия между версиями
TurtlePU (обсуждение | вклад) (→Домашние задания) |
TurtlePU (обсуждение | вклад) (→Некоторые темы для проектов) |
||
Строка 107: | Строка 107: | ||
При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы до 15-го декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла. | При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы до 15-го декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла. | ||
==== Некоторые темы для проектов ==== | ==== Некоторые темы для проектов ==== | ||
+ | |||
+ | Варианты от Евгения Владимировича: | ||
+ | |||
+ | * Определить кольцо Z[X1, X2, ...] многочленов над Z c произвольным количеством переменных. Должны поддерживаться методы show, +, -, *, а также операции подстановки одного многочлена в другой (в частности, вычисление значения в целых точках) и дифференцирования по произвольной переменной. | ||
+ | * Определить понятие формулы первого порядка (в заданной сигнатуре) и реализовать алгоритм приведения таких формул к предваренной нормальной форме. | ||
+ | * Определить понятие пропозициональной формулы и реализовать проверку таких формул на выполнимость с помощью метода резолюций. Метод применим только к КНФ, поэтому еще нужно реализовать полиномиальный алгоритм построения КНФ, «равновыполнимой» данной формуле. | ||
+ | * Реализуйте «угадывающую машину» К. Шеннона. | ||
+ | * Вычислите справедливую стоимость опциона методом "двоичного дерева". | ||
+ | * Реализуйте игру "Жизнь" на торе с графикой ASCII | ||
+ | |||
+ | Варианты от Паши: | ||
+ | |||
+ | * DSL для rich text-а (а-ля Markdown, возможно, с поддержкой формул) | ||
+ | * Библиотека для простых символьных вычислений (с упрощением выражений) | ||
+ | * Бот в телеграм с помощью servant | ||
+ | * Model checker для простых моделей и формул (с нуля) | ||
+ | * Автоматическое дифференцирование, линейная регрессия на его основе (с нуля) | ||
+ | * Консольный роглайк | ||
+ | * Интерпретатор Scheme | ||
+ | * Улучшение интерпретатора лямбда-исчисления | ||
+ | |||
+ | Варианты инициативных проектов от некоторых студентов: | ||
+ | |||
+ | * Решение задач на Codeforces на Haskell | ||
+ | * Crafting Interpreters на Haskell | ||
+ | * Криптографическая библиотека | ||
+ | * Raft с нуля | ||
+ | * Консольный мессенджер | ||
== Материалы == | == Материалы == |
Версия 19:00, 2 декабря 2022
Содержание
Функциональное программирование
Курс по выбору для студентов 3 и 4 курса ФКН ВШЭ, 1 и 2 модуль 2022 г. Функциональное программирование (ФП) представляет собой теоретически изящный, выдержавший проверку временем на практике и оказавший заметное влияние на технологии программирования вообще подход к созданию ПО. Курс посвящен основам ФП в целом и популярного языка Haskell в частности. Попутно сообщаются начальные сведения из области лямбда-исчислений, теории типов, теории категорий.
Преподаватели
Лектор и семинарист: Евгений Дашков, ТГ: @edashkov, edashkov@gmail.com.
Семинарист: Павел Соколов, ТГ: @TurtlePU.
Учебный ассистент: Олег Мкртчян, ТГ: @unwishfulthinking.
Текущая успеваемость
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
Листки и код для семинаров
Домашние задания
Домашние задания выдаются приблизительно раз в две недели; при выдаче каждого задания указывается срок его сдачи. Все задания письменные. Каждая задача оценивается 0, ½ или 1 баллом. Все задания в целом оцениваются числом:
ДЗ = (сумма полученных баллов за все задачи) / (количество выданных задач).
Набор задач | Срок сдачи | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
гр. Дашкова | гр. Соколова | ||||||||||
ДЗ 1 | 20.09 | 20.09 | |||||||||
ДЗ 2 | 11.10 | 11.10 | |||||||||
ДЗ 3 | 01.11 | 01.11 | |||||||||
ДЗ 4 | 26.11 | 26.11 |
Срок сдачи задания устанавливается семинаристом группы.
Ссылка на классрум: https://classroom.google.com/c/OTM4MjAyNzk1MTda?cjc=xbblft6
Контрольная работа
Письменная Контрольная работа проводится в начале второго модуля. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается 0, ½ или 1 баллом. Контрольная оцениваются числом:
КР = (сумма полученных баллов за все задачи) / (количество выданных задач).
Итоговый экзамен
Письменный экзамен проводится в конце курса. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается 0, ¼, ½ , ¾ или 1 баллом. Экзамен оценивается числом:
Э = (сумма полученных баллов за все задачи) / (количество выданных задач).
Индивидуальный проект
При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы до 15-го декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла.
Некоторые темы для проектов
Варианты от Евгения Владимировича:
- Определить кольцо Z[X1, X2, ...] многочленов над Z c произвольным количеством переменных. Должны поддерживаться методы show, +, -, *, а также операции подстановки одного многочлена в другой (в частности, вычисление значения в целых точках) и дифференцирования по произвольной переменной.
- Определить понятие формулы первого порядка (в заданной сигнатуре) и реализовать алгоритм приведения таких формул к предваренной нормальной форме.
- Определить понятие пропозициональной формулы и реализовать проверку таких формул на выполнимость с помощью метода резолюций. Метод применим только к КНФ, поэтому еще нужно реализовать полиномиальный алгоритм построения КНФ, «равновыполнимой» данной формуле.
- Реализуйте «угадывающую машину» К. Шеннона.
- Вычислите справедливую стоимость опциона методом "двоичного дерева".
- Реализуйте игру "Жизнь" на торе с графикой ASCII
Варианты от Паши:
- DSL для rich text-а (а-ля Markdown, возможно, с поддержкой формул)
- Библиотека для простых символьных вычислений (с упрощением выражений)
- Бот в телеграм с помощью servant
- Model checker для простых моделей и формул (с нуля)
- Автоматическое дифференцирование, линейная регрессия на его основе (с нуля)
- Консольный роглайк
- Интерпретатор Scheme
- Улучшение интерпретатора лямбда-исчисления
Варианты инициативных проектов от некоторых студентов:
- Решение задач на Codeforces на Haskell
- Crafting Interpreters на Haskell
- Криптографическая библиотека
- Raft с нуля
- Консольный мессенджер
Материалы
Базовые ресурсы
Стандартная библиотека языка 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 * Э).
Округление производится к ближайшему целому, притом что полуцелые значения округляются вверх.