# Специальное задание по курсу "Функциональное программирование" на КТ В качестве специального задания студентам предлагается реализовать какое-нибудь приложение на языке Haskell. Вы свободны сами выбрать, что реализовывать, но перед тем как начать, необходимо согласовать проект с преподавателями. Обратите внимание, что данное задание **индивидуальное**. Общее правило - один проект не могут писать слишком много людей. ## Технические требования Предполагается, что для выполнения этого задания Вы можете использовать библиотеки языка Haskell. В следующей таблице приведено количество баллов, которое Вы получите, если Ваше приложение выполняет данное требование. | Требование | Баллы | |-----------------------------------|-------| |Имеет графический интерфейс | 10-35 | |Использует сетевое взаимодействие | 5-30 | |Взаимодействие с файловой системой | 5-15 | |Взаимодействие с базой данных | 10-20 | |Приложение распределенное | 10-30 | Обратите внимание, что нижняя оценка за требование в таблице выше приведена в предположении, что Вы реализуете это требование неким разумным и достаточным образом, чтобы получить за это баллы. Имейте ввиду, что это остается на суд преподавателя, и если у вас есть сомнения, будет ли оценен то или иное требование --- лучше спросить, и уж точно не стоит полагаться на него, если он является решающим для Вашей итоговой оценки. Также примите к сведению, что больше оценивается "разносторонность" приложения, нежели сложность реализации. Например, если Вы решите заново реализовать TCP протокол --- вряд ли это будет оценено очень высоко. Также имейте ввиду, что баллы указаны за функциональность, реализованную на Haskell: то есть написать отрисовку на C++ или что-нибудь такое можно, но с уменьшением баллов за сделанное. Также Вы получите дополнительные баллы за качественный код. Ниже перечисленны конструкции языка, за использование которых Вы получите дополнительные баллы. | Конструкция |Баллы | |---------------------------------------|-------| |Монады, отличные от IO/Maybe/Either |3-15 | |Трансформеры монад |3-10 | |Парсер комбинаторы |3-10 | |Параллельность и Concurrency |3-20 | |GADT/Type families/Data kinds/forall |3-25 | |Реализация функций TH |5-10 | |Линзы |3-30 | Обратите внимание, что нижняя оценка за конструкцию в таблице выше приведена в предположении, что Вы используете конструкцию неким разумным и достаточным образом, чтобы получить за это баллы. Имейте ввиду, что это остается на суд преподавателя, и если у вас есть сомнения, будет ли оценен тот или иной критерий --- лучше спросить, и уж точно не стоит полагаться на него, если он является решающим для Вашей итоговой оценки. Также будет оценена сложность реализации логики. Старайтесь писать кроссплатформенный код, чтобы была возможность собрать его на любой системе (хотя бы на MacOS или Linux), для того чтобы проверить полученный результат. Все эти баллы суммируются, и получается результирующая оценка. ## Примеры приложений Ниже приведен список приложений, которые Вы можете реализовать. Также Вы можете предложить свой вариант. * Визуализатор одной из игр: шахмат, шашек или го Помимо очевидного использования графического интерфейса, визуализатор может быть реализован как сервер для игры: к двум портам подключаются две стратегии-клиента и по некоторому протоколу выполняют ходы, которые отображаются на доске. * Программа для трекинга времени работы над задачами и проектами В качестве дополнительной функциональности может быть реализована итеграция со сторонними сервисами, например с Toggle. * Программа для учета доходов/расходов Помимо графического интерфейса, можно также реализовать интеграцию с какими-нибудь сервисами. * Распределенный чат Данный проект предполагает, что нет единого сервера и все данные хранятся на клиентах. Также возможно реализовать функциональность End-To-End шифрование. Использование криптографии приветствуется и будет хорошо оценено. * Torrent клиент Подразумевается, что возможно будет открыть torrent-файл с помощью этого приложения и скачать файл. ## Проверка решений Для данного задания студенты должны создать приватный репозиторий и добавить преподавателей как коллабораторов. Далее ссылку на коммит необходимо отправить кому-либо из преподавателей. После этого проводится проверка на списывание. Все правила описанные [здесь](https://hackmd.io/s/HkCKfNfzE#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8E) распространяются и для специального задания. Будет хорошо, если с ссылкой на коммит Вы также пришлете ссылки на туториалы, которые Вы читали, при написании приложения. Это поможет отличить списывание у другого студента от копирования из Интернета, и понять, какую часть кода Вы написали сами. ## Как получить зачет? Ваше приложение оценивается в соответствии с баллами указанными [тут](#%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Баллы, которые студент получил в течение семестра (за дз и т.д.) суммируются с баллами за Специальное задание. Далее, следуя написанному [здесь](https://hackmd.io/s/HkCKfNfzE#%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%B7%D0%B0%D1%87%D0%B5%D1%82). ## Дедлайн Фактически, дедлайна данное задание не имеет. Но чтобы иметь возможность сдать экзамен (если у Вас не хватит баллов на автомат) и не получить долг --- Вам необходимо отправить на проверку задание до экзамена. Точная дата этого предэкзаменационного дедлайна будет объявлена позже.