1. Сравнение императивного и декларативного подходов к программированию. Примеры языков.
  2. Функциональное программирование. Основные особенности.
  3. История ФП. Возникновение. Семейства языков.
  4. Лямбда-исчисление. Основные понятия и механизмы. Вычисление в лямбда-исчислении.
  5. Лямбда-исчисление. Представление данных. Булеаны Чёрча и пары Чёрча.
  6. Лямбда-исчисление. Представление данных. Числа Чёрча.
  7. Лямбда-исчисление. Рекурсия.
  8. Чистые функции. Особенности программирования на чистых функциях. Функции высших порядков. Каррирование.
  9. Ленивая и энергичная (строгая) стратегии исполнения. Разновидности и примеры.
  10. Язык Haskell. Синтаксис объявления и определения функций и переменных. Встроенные выражения. Префиксная и инфиксная запись.
  11. Язык Haskell. Приоритет и ассоциативность операций. Каррирование и секции.
  12. Язык Haskell. Встроенные типы данных.
  13. Язык Haskell. Пользовательские типы данных.
  14. Язык Haskell. Pattern matching.
  15. Функциональные комбинаторы. Назначение и примеры. ФК над списками и функциями.
  16. Функциональные комбинаторы. Назначение и примеры. Свёртки.
  17. Классы типов в Haskell. Определение и примеры.
  18. Классы типов в Haskell. Моноиды и функторы.
  19. Классы типов в Haskell. Численные классы.
  20. Классы типов в Haskell. Аппликативные функторы, монады.
  21. Монады: Reader, Writer, State.
  22. Монады-трансформеры.
  23. Хвостовая рекурсия.
  24. Амортизированная сложность алгоритмов. Метод банкира. Примеры.
  25. Амортизированная сложность алгоритмов. Метод физика. Примеры.
  26. Изменяемые/неизменяемые структуры данных. Персистентное/эфемерное применение СД.
  27. Функциональные структуры данных: очередь и zipper.
  28. Функциональные структуры данных: деревья поиска. Красно-чёрное дерево.
  29. Функциональные структуры данных: кучи.
  30. Функциональные структуры данных: случайные структуры данных. Treap.
  31. Функциональные структуры данных: случайные структуры данных. Skip list.
  32. Функциональные структуры данных: индексные деревья и хеш-деревья.
  33. Метод расписаний (Scheduling) и его применение к функциональным структурам данных. Очередь с константными операциями.
  34. Ленивое выполнение. Особенности ленивых алгоритмов.
  35. Ленивое выполнение. Работа со списками в ленивом языке.
  36. Ленивое выполнение. Потоки.
  37. Ленивое выполнение. Сильносвязные структуры данных: двусвязные списки и деревья.
  38. Комбинаторы парсеров. Решаемые задачи и применение.
  39. Комбинаторы парсеров. Примеры.
  40. Макросы в языках программирования. Разновидности и примеры.
  41. Макросы в языках программирования. Гигиена, квотирование, реификация.
  42. Макросы в языках программирования. Template haskell.