fp
Описание
Тестовые задания по разделу "Функциональной программирование"
Языки
- Scala100%
Тестовые задания по функциональному программированию
Добро пожаловать в практическую часть изучения функционального программирования! Этот репозиторий содержит набор постепенно усложняющихся задач, которые помогут вам освоить ключевые концепции ФП на Scala.
🛠️ Как приступить к работе
-
Создайте свою копию репозитория
- Нажмите
в правом верхнем углу, чтобы создать персональную версию этого шаблонаFork - Клонируйте свой форк локально:
- Нажмите
-
Запуск тестов
- Все задания проверяются автоматизированными тестами
- Первоначально все тесты будут падать — это нормально!
- Для проверки прогресса используйте:
- По мере решения задач соответствующие тесты будут становиться зелёными (✓)
-
Фокусировка на конкретных задачах
Каждый тестовый набор соответствует определённой теме. Для запуска только нужных тестов:(конкретный путь указан в начале каждого тестового файла)
🔍 Структура заданий
Задачи построены по принципу "от простого к сложному" и охватывают:
- Базовые операции ФП
- Работу с функциями высшего порядка
- Неизменяемые структуры данных
- Композицию и чистые функции
🎯 Критерии завершения
Задание считается выполненным, когда:
✅ Все тесты проходят успешно ( показывает только зелёные отметки)
✅ Код соответствует идиоматичному стилю Scala
✅ Решения используют принципы функционального программирования
💡 Советы по работе
- Начинайте с первого падающего теста и двигайтесь последовательно
- Изучайте сообщения об ошибках — они подскажут направление решения
- Комментируйте свой код, объясняя нетривиальные решения
- Делайте промежуточные коммиты с осмысленными сообщениями
Материалы основаны на учебнике Scala Book.
📝 Список упражнений
Раздел 1.1: Функциональное программирование
Упражнение 1.1.1 - Вычисление факториала
Раздел 1.2: Чистые функции
Упражнение 1.2.1 - Анализ чистых функций
Раздел 1.3: Редукция выражений
Упражнение 1.3.1 - Пошаговая редукция
Упражнение 1.3.2 - Проверка канонической формы
Упражнение 1.3.3 - Полная редукция
Упражнение 1.3.4 - Оптимизированная редукция
Раздел 1.4: Хвостовая рекурсия
Упражнение 1.4.1: Поиск максимального элемента в списке
Упражнение 1.4.2: Подсчёт вхождений элемента в список
Упражнение 1.4.3: Проверка, является ли число простым
Упражнение 1.4.4: Разворот списка
Раздел 1.5: Функции высшего порядка
Упражнение 1.5.1 - Реализация map
Упражнение 1.5.2 - Фабрика валидаторов
Раздел 1.6: Каррирование
Упражнение 1.6.1 - Практика каррирования и частичного применения
Раздел 1.7: Композиция функций
Упражнение 1.7.1 - Базовые операции
Упражнение 1.7.2 - Безопасная композиция
Раздел 2.1: Функциональные структуры данных
Упражнение 2.1.1: Ручное создание списков
Упражнение 2.1.2: Основы сопоставления с шаблоном
Упражнение 2.1.3: Длина списка
Упражнение 2.1.4: Объединение списков
Упражнение 2.1.5: Разворот списка
Упражнение 2.1.6: Поиск элемента в списке
Упражнение 2.2.1: Ручное создание деревьев
Упражнение 2.2.2: Реализация функции size для дерева
Упражнение 2.2.3: Преобразование дерева
Упражнение 2.2.4: Удаление элемента из дерева
Раздел 3.1: Обработка ошибок
Упражнение 3.1.1: Безопасное деление с Option
Упражнение 3.1.2: Поиск адреса доставки по цепочке зависимостей
Упражнение 3.1.3: Работа с опциональными полями профилей: getEmailOrDefault
Упражнение 3.1.4: Работа с опциональными полями профилей: averageAge
Упражнение 3.1.5: Работа с опциональными полями профилей: nameEmailPairs
Упражнение 3.2.1: Безопасное вычисление квадратного корня
Упражнение 3.2.2: Валидация возраста с Either
Упражнение 3.2.3: Валидация пользователя с Either: createUser
Упражнение 3.2.4: Валидация пользователя с Either: createUserDetailed
Раздел 4.1: For-comprehension
Упражнение 4.1.1: Вложенные структуры
Упражнение 4.1.2: Собственный тип для for-comprehension
Упражнение 4.1.3: Совместимость типов в for-comprehension - теоретическое упражнение
Раздел 5.1: Ленивые вычисления
Упражнение 5.1.1: Ленивый if-else
Упражнение 5.1.2: Ленивый Fibonacci
Упражнение 5.1.3: Ленивая генерация чисел Фибоначчи
Раздел 6.1: Функциональное состояние
Упражнение 6.1.1: Генерация последовательности Фибоначчи с помощью State
Раздел 7.1: Функциональный журнал
Упражнение 7.1.1: Базовые операции
Упражнение 7.1.2: Композиция операций
Упражнение 7.1.3: Валидация данных
Упражнение 7.1.4: Трансформация лога
Раздел 8.1: Параллелизм
Упражнение 8.1.1: Параллельное вычисление произведения чисел
Упражнение 8.1.2: Параллельный поиск максимального элемента
Упражнение 8.1.3: Параллельная проверка условия для всех элементов
Упражнение 8.1.4: Параллельное преобразование коллекции (map)
Упражнение 8.1.5: Параллельный reduce
Раздел 9.1: Внешние эффекты и ввод/вывод
Упражнение 9.1.1: Регистрация пользователя
ru.scalabook.external_effects.ExternalEffectsExercises.validateUsername
ru.scalabook.external_effects.ExternalEffectsExercises.validatePassword
ru.scalabook.external_effects.ExternalEffectsExercises.validateUser
Упражнение 9.1.2: Обработка заказа
ru.scalabook.external_effects.ExternalEffectsExercises.calculateTotal
ru.scalabook.external_effects.ExternalEffectsExercises.calculateDiscount
ru.scalabook.external_effects.ExternalEffectsExercises.checkAvailability
Упражнение 9.1.3: Сумма и произведение
ru.scalabook.external_effects.ExternalEffectsExercises.readInput
ru.scalabook.external_effects.ExternalEffectsExercises.readNumber
Раздел 9.2: TailRec: прыжки на батуте
Упражнение 9.2.1: Числа Фибоначчи
Упражнение 9.2.2: Комбинация нескольких TailRec
Упражнение 9.2.3: Взаимно рекурсивные функции
ru.scalabook.external_effects.TailRecExercises.isEven
ru.scalabook.external_effects.TailRecExercises.isOdd
Раздел 9.3: Свободная монада
Упражнение 9.3.1: Реализация монадического интерфейса для
Упражнение 9.3.2: Реализация хвостово-рекурсивного интерпретатора
Упражнение 9.3.3: Реализация универсального интерпретатора для
ru.scalabook.external_effects.FreeExercises.Free.run
ru.scalabook.external_effects.FreeExercises.Free.step
Упражнение 9.3.4: Реализация
Упражнение 9.3.5: Реализация стекобезопасного
Упражнение 9.4.1: Определение для
Упражнение 9.4.2: Определение для
Упражнение 9.4.3: Определение для
Раздел 10.1: Локальные эффекты и изменяемое состояние
Упражнение 10.1.1: Реализация метода fill для STArray
Упражнение 10.1.2: Реализация partition
Упражнение 10.1.3: Реализация qs
Раздел 11.1: Потоковая обработка и инкрементный ввод-вывод
Упражнение 11.1.1: Числа Фибоначчи
Раздел 11.2: Создание Pull-операций
Упражнение 11.2.1: Реализация fromListViaUnfold и fromLazyListViaUnfold
ru.scalabook.stream_processing.PullExercises.Pull.fromListViaUnfold
ru.scalabook.stream_processing.PullExercises.Pull.fromLazyListViaUnfold
Упражнение 11.2.2: Создание бесконечного потока с iterate
Упражнение 11.2.3: Реализация drop для Pull
Упражнение 11.2.4: Реализация takeWhile для Pull
Упражнение 11.2.5: Реализация dropWhile для Pull
Упражнение 11.2.6: Реализация countViaMapAccumulate
Раздел 11.3: Потоки
Упражнение 11.3.1: Реализация exists. Стратегия 1: Только конечный результат (остановка при нахождении)
Упражнение 11.3.2: Реализация exists. Стратегия 2: Все промежуточные результаты (остановка при нахождении)
Упражнение 11.3.3: Реализация exists. Стратегия 3: Все результаты (без остановки)
Упражнение 11.3.4: Конвертер температур
ru.scalabook.stream_processing.PullExercises.Pipe.trimmed
ru.scalabook.stream_processing.PullExercises.Pipe.nonEmpty
ru.scalabook.stream_processing.PullExercises.Pipe.nonComment
ru.scalabook.stream_processing.PullExercises.Pipe.asDouble
ru.scalabook.stream_processing.PullExercises.Pipe.convertToCelsius
ru.scalabook.stream_processing.PullExercises.Pipe.conversion
ru.scalabook.stream_processing.PullExercises.Pipe.convert
Раздел 11.4: Расширяемые Pull и Stream
Упражнение 11.4.1: Реализация конструктора для
Упражнение 11.4.2: Реализация метода для
Упражнение 11.4.3: Реализация генераторов для и
ru.scalabook.stream_processing.EffectfulPulls.Pull.unfoldEval
ru.scalabook.stream_processing.EffectfulPulls.Stream.unfoldEval