Вопросы к экзамену по курсу "Введение в функциональное программирование"

  1. Определение функционального программирования. Связь с императивным программированием. Связь с другими моделями вычислений, тезис Черча-Тюринга.
  2. Строгие нестрогие и спекулятивные вычисления. Динамическая и статическая типизация. Практическое применение функционального программирования.
  3. Нетипизированное лямбда-исчисление.
  4. Примитивно типизированное лямбда-исчисление. Рекурсивные типы. Интуиционисская логика. Проверка типов.
  5. Изоморфизм Карри-Говарда.
  6. Параметрический полиморфизм. Вывод типов.
  7. Категории. Категория множеств, Порядок. Свободный моноид. Связь категорий и графов. Изоморфизм категорий. Коммутативные диаграммы.
  8. Произведения и суммы объектов категорий.
  9. Категория Circ.
  10. Категория Flow.
  11. Дистрибутивные категории. Связь с императивным программированием.
  12. Типы данных как категории. Доказательство свойств.
  13. Система автоматизации доказательств Coq. Функциональное программирование в Coq. Использование вывода типов для доказательства теорем в интуиционисской логике.
  14. Использование ssreflect. Эквивалентность и переисывание. Булева рефлексия.
  15. Использование ssreflect. Индуктивные доказательства. Кодирование структур.
  16. Сравнение синтаксиса Java и Scala
  17. Представление структур данных в Scala
  18. Функциональный подход к обработке ошибок
  19. Ленивые вычисления в Scala
  20. Функциональный параллелизм
  21. Тестирование свойств
  22. Парсер как композиция частичных парсеров
  23. Моноиды и монады
  24. Аппликативные функторы
  25. Локальные эффекты и изменяемое состояние.
  26. Ввод/вывод. Потоковый ввод/вывод.
  27. Обработка больших данных. Преимущества функционального программирования для масштабирования.
  28. Использование Scala для обработки больших данных. Платформа SMACK (Spark, Mesos, Akka, Kasandra, Kafka).
  29. Apache Spark
  30. Akka
  31. Apache Kafka
  32. Интеграция компонент SMACK и связь с функциональным программированием.