Учебник Haskell для начинающих
Полный курс по Haskell — языку чистого функционального программирования. Разбираем чистоту и неизменяемость, систему типов и классы типов, ленивые вычисления, функции высшего порядка и композицию, а затем спокойно и без страха объясняем монады и ввод-вывод. Много схем, понятных аналогий и запускаемых врезок на Python, которые показывают функциональные идеи в знакомом языке.
Курс «Haskell: функциональное программирование» состоит из 6 разделов и 23 уроков: Основы: чистота, GHCi, первая программа, Функции и сопоставление с образцом, Типы и классы типов, Списки и ленивость, Функции высшего порядка и композиция и Монады и IO: что дальше. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Основы: чистота, GHCi, первая программа
- Зачем Haskell и что значит «чистый»
Что такое Haskell, чем чистое функциональное программирование отличается от привычного и почему это полезно.
- GHC, GHCi и первый запуск
Знакомство с GHC 9.x, интерактивной оболочкой GHCi и тем, как пробовать выражения вживую.
- Выражения, значения и неизменяемость
Почему в Haskell всё — выражение, что такое неизменяемые значения и как обходиться без присваивания.
- Зачем Haskell и что значит «чистый»
2 Функции и сопоставление с образцом
- Определение функций и карринг
Как объявляются функции в Haskell, что такое каррирование и почему все функции принимают один аргумент.
- Сопоставление с образцом
Pattern matching: как разбирать данные по форме, сопоставлять конструкторы и писать ясные функции без вложенных if.
- Рекурсия вместо циклов
Почему в Haskell нет циклов, как мыслить рекурсивно, базовый и рекурсивный случай, аккумуляторы.
- Лямбды и операторы как функции
Анонимные функции (лямбды), операторы как обычные функции, секции и инфиксная запись.
- Определение функций и карринг
3 Типы и классы типов
- Система типов и сигнатуры
Зачем нужна статическая типизация, как читать сигнатуры с :: и -> и почему типы — это документация.
- Свои типы данных: data
Объявление собственных типов через data, конструкторы, перечисления и типы-произведения.
- Классы типов: Eq, Ord, Show
Что такое классы типов, как работают Eq, Ord, Show, Num и зачем нужен полиморфизм по ограничениям.
- Параметрический полиморфизм
Обобщённые типы с переменными типа, дженерики Haskell и почему id :: a -> a работает для всего.
- Система типов и сигнатуры
4 Списки и ленивость
- Списки и их устройство
Как устроены списки в Haskell, операторы : и ++, конструирование и разбор, основные функции.
- Генераторы списков
List comprehensions: компактное построение списков с условиями и преобразованиями в духе математики.
- Ленивые вычисления
Что такое ленивость, отложенные вычисления (thunks) и почему Haskell считает только то, что реально нужно.
- Списки и их устройство
5 Функции высшего порядка и композиция
- map, filter и преобразование данных
Функции высшего порядка map и filter: применение функции к каждому элементу и отбор по условию.
- Свёртки: foldr и foldl
Свёртки fold: как свести список к одному значению, foldr против foldl, обобщение суммы и произведения.
- Композиция функций
Оператор композиции (.), соединение функций в конвейер и применение через ($).
- Point-free стиль и читаемость
Бесточечный стиль: запись функций без явных аргументов, когда он помогает и когда вредит читаемости.
- map, filter и преобразование данных
6 Монады и IO: что дальше
- Maybe: безопасность без исключений
Тип Maybe для значений, которых может не быть: Just и Nothing вместо null и исключений.
- Either и обработка ошибок
Тип Either для результата с описанием ошибки: Left для проблемы, Right для успеха.
- Что такое монада на самом деле
Монада без академизма: конвейер вычислений с контекстом, оператор >>= и интуиция «и затем».
- Монада IO и ввод-вывод
Как Haskell делает ввод-вывод, оставаясь чистым: тип IO, do-блоки, putStrLn и getLine.
- Куда двигаться дальше
Обзор экосистемы Haskell 2024-2025: cabal и stack, ключевые библиотеки, ресурсы и план развития.
- Maybe: безопасность без исключений