Ссылка на сайт откуда был взят курс
Основная цель - сделать бота из Задания 3
- [[Полезные ресурсы]]
- [[Отчеты]]
-
ghcup
- ghc
- cabal
- haskell language sever
- stack
-
О Haskell по-человечески
-
Выполнение обязательных ката на codewars (Задание 1)
-
[x]
-
[x]
-
[x]
-
codewars хПрофиль codewars
- Learn You a Haskell for Great Good!
- [Introduction](http://learnyouahaskell.com/introduction
- Starting Out
- Types and Typeclasses
- Syntax in Functions
- Recursion
- Higher Order Functions
- Modules
- Making Our Own Types and Typeclasses
- Input and Output
- Functionally Solving Problems
- Functors, Applicative Functors and Monoids
- A Fistful of Monads
- For a Few Monads More
- Zippers
- Выполнение не обязательных ката на codewars
- [[cw-0000_0008 Valid Braces]]
- [[cw-0000_0009 Product of consecutive Fib numbers]]
- [[cw-0000_0010 Reverse words]]
- Snail неизвестно мин^[Интересная с задача с простым условием, для которой сразу понятен императивный алгоритм с вложенными циклами, но не сразу — функциональный. Помечена как 4-ый кью, но на самом деле достаточно первых глав LYAH и умения работать со списками.]
- Equal sides of array неизвестно мин^[В задаче нужно найти индекс элемента в списке, где сумма элементов списка слева будет равна сумме элементов списка справа от найденного элемента. Если же такого элемента нет, то вывести -1. В этой кате можно отработать работу со списками, поискать вспомогательные функции в модуле Data.List или же просто посмотреть интересные решение других людей.]
- Go so far around to the right that you end up left неизвестно мин^[Необходимо реализовать левую свертку через правую. Для решения нужно ознакомиться с реализацией обеих сверток и хорошо понимать, как работает каждая из них. Для решения нужно хорошо разобраться в принципе работы обеих сверток, так как использовать reverse = читерить.]
- Take a Ten Minute Walk неизвестно мин^[Нужно проверить предложенный маршрут (движение по сторонам света) на два условия: длительность (10 минут при минуте на одно перемещение) и совпадение начальной и конечной точки (вернуться туда, откуда пришёл). Тренирует работу со списками или использование Data.List.]
- Highest Rank Number in an Array неизвестно мин^[Небольшая ката для практики бесточечного стиля и работы со стандартными модулями типа Data.List, Data.Ord и т.д. на ваш выбор.]
- Duplicate Encoder неизвестно мин^[Простая ката, нацеленная на поиск дубликатов в массиве, что часто встречается в реальных задачах.]
- Next bigger number with the same digits неизвестно мин^[Ката с очевидным брутфорс-решением. Попытайтесь найти наиболее оптимальный алгоритм, потому как если написать слишком просто, то все тесты пройти не успеет.]
- Find The Parity Outlier неизвестно мин^[У FindOutlier множестово разных решений функциями из Data.List, или можно в лоб, сверткой, тренирует паттерн матчинг и функции как объекты первого класса.]
- Most frequently used words in a text неизвестно мин^[Достаточно простая ката для 4 кью. Тренирует обработку строки с использованием Data.Char и Data.List.]
- Fibonacci, Tribonacci and friends неизвестно мин^[Логическое продолжение каты Tribonacci, достаточно интересное и неординарное решение, тренирует мозги.]
- Sortable Shapes неизвестно мин^[Это простая ката 6 кью (30 минут на решение достаточно) позволит Вам потренироваться в создании пользовательского типа данных. Основной результат - это понимание реализации каких классов нужно предусмотреть для созданного типа, чтобы данные могли отправляться в функцию sort.]
- Recurrence relations неизвестно мин
- Simple Fun #74: Growing Plant неизвестно мин
- Coloured Triangles неизвестно мин
- Digital Root неизвестно мин
- Twice linear неизвестно мин
- Playing with laziness неизвестно мин
- Break camelCase неизвестно мин
- CamelCase Method неизвестно мин
- Speed Control неизвестно мин
- учебник чуть более глубоко описывающий Haskell.^[Позволяет понять многие теоретические моменты. Обязательны к прочтению главы 1-9, остальные по желанию.]
- видео-курс на степик от Дениса Москвина. (Ниже разбит на части)
- Функциональное программирование на языке Haskell.^[первая часть курса, очень системный и развернутый материал по Haskell. Она обязательна к изучению.]
- Введение
- Основы программирования
- Списки
- Типы данных
- Монады
- Функциональное программирование на языке Haskell (часть 2).^[2-я часть курса, она уже необязательна. Материал тут достаточно сложный, его рекомендуем изучать после того, как сделаны первые версии бота и сервера, чтобы закрепить полученные на практике знания и расширить/углубить их.]
- Аппликативные функторы
- 1.1 Определение аппликативного функтора ≈ 2 ч 3 мин
- 1.2 Представители класса типов Applicative ≈ 1 ч 34 мин
- 1.3 Аппликативный парсер Parsec ≈ 43 мин
- 1.4 Аппликативный парсер своими руками ≈ 1 ч 51 мин
- 1.5 Композиция на уровне типов ≈ 1 ч 15 мин
- Управление эффектами
- 2.1 Класс типов Foldable ≈ 1 ч 41 мин
- 2.2 Класс типов Traversable ≈ 1 ч 47 мин
- 2.3 Законы и свойства класса Traversable ≈ 1 ч 44 мин
- 2.4 Связь классов Monad и Applicative ≈ 1 ч 32 мин
- 2.5 Классы типов Alternative и MonadPlus ≈ 57 мин
- Монады и эффекты
- 3.1 Монада Except ≈ 1 ч 18 мин
- 3.2 Монада Cont ≈ 57 мин
- 3.3 Трансформеры монад ≈ 46 мин
- 3.4 Трансформер ReaderT ≈ 1 ч 46 мин
- Трансформеры монад
- 4.1 Трансформер WriterT ≈ 1 ч 23 мин
- 4.2 Трансформер StateT ≈ 1 ч 4 мин
- 4.3 Трансформер ExceptT ≈ 1 ч 0 мин
- 4.4 Неявный лифтинг ≈ 57 мин
- 4.5 Задачи на трансформеры ≈ 5 мин
- Аппликативные функторы
- Typeclassopedia. неизвестно мин^[системное описание почти всех самых популярных тайпклассов]
-
Очень рекомендуется: книга для начинающих с хорошим практическим уклоном Get Programming with Haskell (W. Kurt).^[Т.к. эта книга не доступна бесплатно, мы не включили её в обязательную часть, но очень рекомендуем. Здесь есть очень приближенные к реальным задачи, с помощью которых вы можете быстро и эффективно начать писать свои приложения, вроде бота. Книга максимально свежая и актуальная, хорошо написана. Практика показала, что изучающие её в рамках нашей программы потом её активно хвалили :)]
-
сделать упражнения из глав Real World Haskell, которые помогут освоиться с приближенными к реальным задачам.
-
По желанию: часто рекомендуемая многими новичками книга http://haskellbook.com/.
-
По желанию: видео-курс от Николая Кудасова.
-
По желанию: Write Yourself a Scheme in 48 Hours.-
Упражнение по написанию простого интерпретатора для языка Scheme (язык, с которого был слизан JavaScript). https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_HoursЕсть так же перевод на русский (там могут быть не все части или неактуальные данные): https://ru.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours
Очень рекомендую пройти, на самом деле туториал довольно небольшой, но дает хороший пример написания средних по размеру програм, в то время как почти все остальные туториалы нацелены на примеры совсем тривиальных вещей в один-два файла.
-
Выводы и ссылки на рецензии о современных книгах по Haskell.
-
Статьи по различным темам, которые могут оказаться полезными для понимания того или иного материала
- Рекомендуемые каты
- Бесконечные структуры
- Создание своих инстансов для 5 базовых монад
- Монадный стек Maybe + List + State
- Представление структур данных из функций.^[Практически любой тип данных можно представить даже в языке без специальных синтаксических конструкций, если этот язык поддерживает функции высшего порядка и замыкания. Haskell как раз имеет специальные синтаксические конструкции для создания алгебраических типов данных, однако на замену им могут прийти простые функции. Как с их помощью сэмулировать пары, Maybe и даже списки как раз продемонстрирует эта ката. . Также для закрепления концепции алгебраических типов данных рекомендую подглаву 2.1 книги SICP, там этот подход отлично описан. Саму книгу в целом тоже рекомендую в дальнейшем прочесть, хотя многие темы там уже по продвинутым темам.]
- Изоморфизм (на самом деле довольно простая и интересная ката)
- Необязательные каты
- Алгебраические изоморфизмы (после каты Изоморфизм)
- Синглтоны.^[Несложная ката, решив которую можно познакомиться с зависимыми типами. Несмотря на то, что в Хаскеле на данный момент зависимых типов нет, последние можно сымитировать при помощи некоторых расширений ghci и типов-синглтонов - типов, имеющих только одно значение.]
- Корутины
- Lens
- Простой компилятор
- Обязательно попробуйте найти и пройти еще от 3-х кат (1, 2 или 3 kyu) самостоятельно.
Нужно написать эхо-бота, который умеет просто отправлять сообщение от пользователя ему же в ответ.
Бот должен уметь работать с сообщениями через несколько механизмов доставки:
- консоль: сообщение пользователя вводится со стандартного ввода, ответ бота выводится в стандартный вывод (например, с помощью getLine и putStrLn).
- Telegram: https://core.telegram.org/bots/api#poll
- Вместо Telegram можно выбрать VK (см. документацию) или Slack.
- Пользователь может отправить команду /help и увидеть текст, описывающий бота.
- Пользователь может отправить команду /repeat, и в ответ бот отправит, какое сейчас выбрано значение повторов и вопрос, сколько раз повторять сообщение в дальнейшем. К вопросу будут прилагаться кнопки для выбора ответа (кнопки с цифрами от 1 до 5). После выбора пользователем все ответы бота должны дублировать сообщение пользователя указанное кол-во раз. Кол-во повторов должно быть индивидуальным для каждого пользователя, т. е. если один пользователь выбрал 3 повторения, то второму мы по-прежнему показываем начальное кол-во сообщений.
- Все должно быть максимально кастомизируемо через конфиги:
- Сообщение, отправляемое в ответ на /help.
- Вопрос по команде /repeat.
- Начальное кол-во повторов на каждый ответ.
- Бот должен уметь повторять только текстовые сообщения и какой-нибудь один вид мультимедийных сообщений (например, стикеры или картинки). Остальные виды сообщений можно игнорировать. Конечно, этот пункт не распространяется на сообщения из консоли.
- Можно взять за основу шаблон проекта. Он содержит "скелет" логики бота и некоторые тесты. Запустите stack test и попробуйте исправить логику, чтобы тесты начали проходить. Шаблон можно как угодно править по своему усмотрению, а можно не использовать совсем.
- Для основного кода проекта (кроме тестов) использовать только библиотеки из стандартной поставки Haskell Platform и три сторонние:
- Для отправки http-запросов
- Для парсинга json
- Для работы с конфигом.
- Все остальное должно быть сделано по максимуму без библиотек. Для тестов можете использовать любой удобный вам инструмент (hspec, HUnit, etc).
- Обновления от Телеграма получать не посредством веб-хуков, а посредством поллинга. Отправлять запрос за апдейтами телеграму, тот сам будет ставить ответ на паузу, если обновок нет, и отвечать сразу, как только что-то появилось. Ну или отвечать пустым массивом по таймауту. Это требование вкупе с тем, что в следующем задании надо будет свой сервер на Warp реализовать, поможет лучше понять, что такое модель поллинга и модель пуша (через веб-хуки), в чем преимущества и недостатки каждой из моделей.
- Результатом должно быть одно приложение, а не два. В каком режиме его запускать (Telegram или консоль), определяется параметром в конфиге или опцией командной строки.
- Проект должен быть в отдельном репозитории на github, во время выполнения задания коммиты делать как можно чаще, как минимум раз в день, когда написана хоть строчка кода.
- Использовать stack, все используемые библиотеки должны быть зафиксированы в файле package.yaml, сам проект должен быть инициирован командой stack new, которая создает базовую структуру Haskell-проекта.
- Для разворачивания должно быть достаточно клонирования репозитория и запуска stack build. Обязательно проверить это правило клонированием репозитория в отдельную папку у себя и запуска stack build — результатом должны быть собранные и рабочие бинарники.
- У каждого проекта должно быть README с описанием того, как разворачивать проект локально и как его запускать, а так же с описанием базовой структуры, чтобы новичок мог легко разобраться (представьте, что после вас проект будет поддерживать совсем нулевой джуниор). Все должно быть на английском.
- Проект должен иметь файл .gitignore, куда внесены все автогенерируемые файлы проекта, локальные конфиги и т.д. Обязательно добавьте туда следующие папки (даже если вы не пользуетесь редактором VSCode, им пользуемся мы и это правило для нашего удобства при проверке):
- .vscode
- .history
- Проект должен быть покрыт unit-тестами, которые бы покрывали главные use-case каждого модуля в приложении.
- Конфиги должны быть вынесены в отдельный файл с возможностью переписать локально какие-нибудь значения, но не изменять файлы из git-репозитория, чтобы случайно не запушить пароль или токен.
- Проект должен поддерживать логи разных уровней, все ключевые моменты должны грамотно логироваться, логи должны легко конфигурироваться хотя бы так, чтобы можно было включать/выключать логи до определенного уровня (например, показывать все от DEBUG и выше, или показывать все от WARN и выше).
- Для понятной архитектуры рекомендуем использовать Handle Pattern, так как мы применяем его в большинстве своих проектов.
- Чтобы добиться понятной архитектуры проекта, и получить тестируемый код, также можно применять различные техники (паттерны) описанные сообществом:
- Полезно почитать требования к проекту из задания 5 (код-ревью). На старте проекта необязательно забивать себе ими голову — потом успеете, но, все-таки, если знать их заранее, придется меньше исправлять.
- Для начала можно посмотреть простую статью про то, как начать собирать первое приложение по отправке HTTP-запроса и получению одного нужного поля из JSON
- Designing Testable Components
- Полезные статьи для данного задания:
- Telegram-бот на Python: от первой строчки до запуска на Heroku
не будет пока не сделаю задания 3 и 4
Что нужно будет сделать когда будет время
- Пройти ВСЕ Haskell ката на codewars
- Прочесть Error vs. Exception - HaskellWiki
- Блог Нила Митчелла (Haskell и т. д.): В погоне за утечкой пространства при встряхивании
- GHC.Base
- Понять исходный код этих функций
- Прочитать и понять monomorphism restriction
- Прочитать про бесточечный стиль
- Разобраться как работает [[Очень интересный парсер]]
- Реализовать парсер
- Попробовать написать аналог bfxr на haskell
- Прочесть руководство пользователя GHC