Backend-разработка
Присоединяйтесь к нашей программе обучения
Задание 1: теория
Установка ПО
Рекомендуем установить Haskell Stack и все упражнения запускать в нем.
установка для Windows:
имя вашего пользователя Windows должно содержать только латинские буквы и цифры, никаких пробелов. В противном случае создайте нового пользователя-администратора с подходящим именем, например, admin, и продолжайте установку из него. Переименование юзера не годится, нужно создать нового.
используйте установщик, минимальная версия системы - Windows 7 64-разрядная.
установка для Linux & Mac OS X: установите по инструкции или поставьте нужный пакет (stack или haskell-stack) через пакетный менеджер вашей ОС (apt, yum, brew и т.п.). Версия на сайте более свежая.
Больше ничего устанавливать не требуется, никаких Haskell Platform, ghcup, ghc, cabal. Stack самостоятельно скачает и установит компилятор и библиотеки.Как запустить: откройте консоль (командную строку) и наберите команду stack repl - запустится интерпретатор выражений Haskell. В первый раз придется подождать, пока загрузится и установится компилятор. Если установка выполнена правильно, отобразится подсказка ко вводу:
Prelude> _
Базовая подготовка
Минимум, необходимый для написания самых простых проектов:
О Haskell по-человечески - можно использовать в дополнение. Это простой учебник на русском, но он не закончен.
Параллельно выполняйте каты из Codewars
Обязательно попробуйте найти и пройти от 3-х кат самостоятельно! Можете взглянуть на список дополнительных кат от тех, кто проходил обучение до вас.
Более сложная теория
После того, как изучены вышеназванные источники, можно одновременно выполнять дальнейшие задания и понемногу изучать следующие ресурсы.
Обязательно: системное описание почти всех самых популярных тайпклассов — Typeclassopedia.
Обязательно: учебник чуть более глубоко описывающий Haskell — https://anton-k.github.io/ru-haskell-book/book/home.html. Позволяет понять многие теоретические моменты. Обязательны к прочтению главы 1-9, остальные по желанию.
Обязательно: видео-курс на степик от Дениса Москвина.
https://stepik.org/course/75/ — первая часть курса, очень системный и развернутый материал по Haskell. Она обязательна к изучению.
https://stepik.org/course/693/ - 2-я часть курса, она уже необязательна. Материал тут достаточно сложный, его рекомендуем изучать после того, как сделаны первые версии бота и сервера, чтобы закрепить полученные на практике знания и расширить/углубить их.
Очень рекомендуется: книга для начинающих с хорошим практическим уклоном 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.
Статьи по различным темам, которые могут оказаться полезными для понимания того или иного материала
Рекомендуемые каты
Ниже рекомендуемые для прохождения каты из Codewars. Они примерно отсортированы от легких к сложным, выбирайте сами подходящий момент, когда начинать их делать (но по большей части после 6 главы Learn you a Haskell можно смело браться за первые задания):
Is this a triangleОпределение, могут ли данных три числа быть длинами сторон треугольника. С этой катой тренируются базовые логические конструкции. Полезно, что есть простор и для элегантных решений, и для решений "в лоб". Есть вероятность, что практикующий потренирует так же совсем базовую работу со списками (хотя тут это необязательно).
Disemvowel trollsЗадача на удаление всех гласных (почти) из строки. Позволяет закрепить отношение к строкам, как к списку символов, тренирует работу со списками, особенно базовые навыки фильтрации. Ката была выбрана в том числе из-за интересного оформления самой задачи и конкретного use case, где нужно защищаться от кричащих троллей :)
Highest and lowestНайти самое большое и самое маленькое значение из строки чисел, которую надо предварительно распарсить. Отличная задача для начального уровня, позволяет натренировать парсинг инстансов Read и самую базовую работу со списками (на поиск наименьшего и наибольшего значений). Естественно, и то, и другое, будет полезно уже при решении реальных задач.
IsogramsЗадача на вычисление дубликатов в массиве. Это наглядный экземпляр стандартного алгоритмического задания, которое в разных вариациях часто встречается в упражнениях почти на всех языках. Здесь же можно опробовать её на Хаскеле и сравнить (на деле или интуитивно) с тем, как бы это решалось на остальных языках. Как и почти во всех классических задачах, тут есть простор для фантазии, несмотря на простоту описания. Можно решать как банальными конструкциями, а можно попытаться найти что-то изящное :)
Split stringsЗадача с предельно простым описанием, очень ясным примером, но которая не такая очевидная в решении. Хорошо иллюстрирует работы с паттерн-матчингом и конструированием списков, которые тут приходится то разбирать, то собирать. Ну и, естественно, отличная тренировка самой базовой рекурсии.
Tribonacci sequenceИнтересная вариация набившей оскомину задачи про ряд Фибоначчи. Очень простое с виду изменение правил игры заставляет призадуматься. Ката отлично тренирует конструирование списков и рекурсию, либо умение обходиться без рекурсии стандартными функциями высшего порядка :)
Title caseКульминация базовых тренировок, где необходимо уметь работать и с символами, и со строками, и со списками. Задача, которая действительно может встретиться в боевых условиях, и которая позволит показать навыки написания "читаемого" кода. Здесь есть возможность, как для явной рекурсии, так и для использования стандартных функций высшего порядка, есть интересное требование замены буквы на заглавный аналог и условие, когда вообще ничего делать не надо :)
Дополнительные каты
Публикуем список дополнительных кат от тех, кто проходил обучение до вас) Все это не обязательно к выполнению, это просто для вашего собственного развития. Список будет дополняться. :)
DubstepПозволяет ещё немного потренироваться работать со списками. Можно написать рекурсивное решение, либо попробовать работать со свёртками, либо просто глубже поковырять стандартную библиотеку и найти в ней функции, позволяющие легко справиться с задачей.
Valid bracesНужно проверить все ли скобки в выражении закрываются. Можно решать разными способами. Она заставляет задуматься, что является аналогом стека в хаскеле, и тренирует навыки обращения со свертками.
Product of consecutive Fib numbersНужно найти является ли переданное число произведением соседних чисел в последовательности Фибоначчи. Задача тренирует навыки создания рекурсии, или обращения с функциями из Data.List.
Reverse wordsПеревернуть все слова по отдельности. Пробелы оставить как есть. У этой каты есть красивое решение с использованием комбинатора из Data.Function. Будет полезно познакомиться с этим модулем.
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.