fp

Шаблон
3

Описание

Тестовые задания по разделу "Функциональной программирование"

https://scalabook.ru/fp/index.html

Шаблон

Используйте репозиторий как шаблон для создания нового репозитория

Языки

  • Scala100%
4 месяца назад
3 месяца назад
4 месяца назад
4 месяца назад
9 месяцев назад
4 месяца назад
6 месяцев назад
4 месяца назад
4 месяца назад
README.md

Тестовые задания по функциональному программированию

Добро пожаловать в практическую часть изучения функционального программирования! Этот репозиторий содержит набор постепенно усложняющихся задач, которые помогут вам освоить ключевые концепции ФП на Scala.

🛠️ Как приступить к работе

  1. Создайте свою копию репозитория

    • Нажмите
      Fork
      в правом верхнем углу, чтобы создать персональную версию этого шаблона
    • Клонируйте свой форк локально:
  2. Запуск тестов

    • Все задания проверяются автоматизированными тестами
    • Первоначально все тесты будут падать — это нормально!
    • Для проверки прогресса используйте:
    • По мере решения задач соответствующие тесты будут становиться зелёными (✓)
  3. Фокусировка на конкретных задачах
    Каждый тестовый набор соответствует определённой теме. Для запуска только нужных тестов:

    (конкретный путь указан в начале каждого тестового файла)

🔍 Структура заданий

Задачи построены по принципу "от простого к сложному" и охватывают:

  • Базовые операции ФП
  • Работу с функциями высшего порядка
  • Неизменяемые структуры данных
  • Композицию и чистые функции

🎯 Критерии завершения

Задание считается выполненным, когда:
✅ Все тесты проходят успешно (

sbt test
показывает только зелёные отметки)
✅ Код соответствует идиоматичному стилю Scala
✅ Решения используют принципы функционального программирования

💡 Советы по работе

  • Начинайте с первого падающего теста и двигайтесь последовательно
  • Изучайте сообщения об ошибках — они подскажут направление решения
  • Комментируйте свой код, объясняя нетривиальные решения
  • Делайте промежуточные коммиты с осмысленными сообщениями

Материалы основаны на учебнике Scala Book.

📝 Список упражнений

Раздел 1.1: Функциональное программирование

Упражнение 1.1.1 - Вычисление факториала

ru.scalabook.fp.Introduction.factorial

Раздел 1.2: Чистые функции

Упражнение 1.2.1 - Анализ чистых функций

ru.scalabook.fp.Introduction.pureFunction

Раздел 1.3: Редукция выражений

Упражнение 1.3.1 - Пошаговая редукция

ru.scalabook.fp.Reduction.oneStepReduction

Упражнение 1.3.2 - Проверка канонической формы

ru.scalabook.fp.Reduction.isCanonical

Упражнение 1.3.3 - Полная редукция

ru.scalabook.fp.Reduction.reduction

Упражнение 1.3.4 - Оптимизированная редукция

ru.scalabook.fp.Reduction.optimizedOneStepReduction

Раздел 1.4: Хвостовая рекурсия

Упражнение 1.4.1: Поиск максимального элемента в списке

ru.scalabook.fp.TailRecursion.maxTailRec

Упражнение 1.4.2: Подсчёт вхождений элемента в список

ru.scalabook.fp.TailRecursion.countOccurrences

Упражнение 1.4.3: Проверка, является ли число простым

ru.scalabook.fp.TailRecursion.isPrime

Упражнение 1.4.4: Разворот списка

ru.scalabook.fp.TailRecursion.reverseTailRec

Раздел 1.5: Функции высшего порядка

Упражнение 1.5.1 - Реализация map

ru.scalabook.fp.Hof.map

Упражнение 1.5.2 - Фабрика валидаторов

ru.scalabook.fp.Hof.validatorFactory

Раздел 1.6: Каррирование

Упражнение 1.6.1 - Практика каррирования и частичного применения

ru.scalabook.fp.Curring

Раздел 1.7: Композиция функций

Упражнение 1.7.1 - Базовые операции

ru.scalabook.fp.Composition.solution

Упражнение 1.7.2 - Безопасная композиция

ru.scalabook.fp.Composition.solution2

Раздел 2.1: Функциональные структуры данных

Упражнение 2.1.1: Ручное создание списков

ru.scalabook.structures.LinkedListConstruction

Упражнение 2.1.2: Основы сопоставления с шаблоном

ru.scalabook.structures.LinkedList.describe

Упражнение 2.1.3: Длина списка

ru.scalabook.structures.LinkedList.length

Упражнение 2.1.4: Объединение списков

ru.scalabook.structures.LinkedList.append

Упражнение 2.1.5: Разворот списка

ru.scalabook.structures.LinkedList.reverse

Упражнение 2.1.6: Поиск элемента в списке

ru.scalabook.structures.LinkedList.contains

Упражнение 2.2.1: Ручное создание деревьев

ru.scalabook.structures.TreeConstruction

Упражнение 2.2.2: Реализация функции size для дерева

ru.scalabook.structures.Tree.size

Упражнение 2.2.3: Преобразование дерева

ru.scalabook.structures.Tree.map

Упражнение 2.2.4: Удаление элемента из дерева

ru.scalabook.structures.Tree.remove

Раздел 3.1: Обработка ошибок

Упражнение 3.1.1: Безопасное деление с Option

ru.scalabook.handling_errors.OptionExercises.safeDivide

Упражнение 3.1.2: Поиск адреса доставки по цепочке зависимостей

ru.scalabook.handling_errors.OptionExercises.getShippingAddress

Упражнение 3.1.3: Работа с опциональными полями профилей: getEmailOrDefault

ru.scalabook.handling_errors.OptionExercises.getEmailOrDefault

Упражнение 3.1.4: Работа с опциональными полями профилей: averageAge

ru.scalabook.handling_errors.OptionExercises.averageAge

Упражнение 3.1.5: Работа с опциональными полями профилей: nameEmailPairs

ru.scalabook.handling_errors.OptionExercises.nameEmailPairs

Упражнение 3.2.1: Безопасное вычисление квадратного корня

ru.scalabook.handling_errors.EitherExercises.safeSqrt

Упражнение 3.2.2: Валидация возраста с Either

ru.scalabook.handling_errors.EitherExercises.parseAge

Упражнение 3.2.3: Валидация пользователя с Either: createUser

ru.scalabook.handling_errors.EitherExercises.createUser

Упражнение 3.2.4: Валидация пользователя с Either: createUserDetailed

ru.scalabook.handling_errors.EitherExercises.createUserDetailed

Раздел 4.1: For-comprehension

Упражнение 4.1.1: Вложенные структуры

ru.scalabook.laziness.ForComprehension.numbers

Упражнение 4.1.2: Собственный тип для for-comprehension

ru.scalabook.laziness.ForComprehension.result

Упражнение 4.1.3: Совместимость типов в for-comprehension - теоретическое упражнение

Раздел 5.1: Ленивые вычисления

Упражнение 5.1.1: Ленивый if-else

ru.scalabook.laziness.Laziness.lazyIf

Упражнение 5.1.2: Ленивый Fibonacci

ru.scalabook.laziness.Laziness.fib

Упражнение 5.1.3: Ленивая генерация чисел Фибоначчи

ru.scalabook.laziness.Laziness.fibsViaUnfold

Раздел 6.1: Функциональное состояние

Упражнение 6.1.1: Генерация последовательности Фибоначчи с помощью State

ru.scalabook.state.StateExercises.fibState

Раздел 7.1: Функциональный журнал

Упражнение 7.1.1: Базовые операции

ru.scalabook.writer.WriterExercises.computation

Упражнение 7.1.2: Композиция операций

ru.scalabook.writer.WriterExercises.sqrtWithLog

Упражнение 7.1.3: Валидация данных

ru.scalabook.writer.WriterExercises.validatePerson

Упражнение 7.1.4: Трансформация лога

ru.scalabook.writer.WriterExercises.mapLog

Раздел 8.1: Параллелизм

Упражнение 8.1.1: Параллельное вычисление произведения чисел

ru.scalabook.parallelism.Par.product

Упражнение 8.1.2: Параллельный поиск максимального элемента

ru.scalabook.parallelism.Par.max

Упражнение 8.1.3: Параллельная проверка условия для всех элементов

ru.scalabook.parallelism.Par.all

Упражнение 8.1.4: Параллельное преобразование коллекции (map)

ru.scalabook.parallelism.Par.parMap

Упражнение 8.1.5: Параллельный reduce

ru.scalabook.parallelism.Par.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: Числа Фибоначчи

ru.scalabook.external_effects.TailRecExercises.fibonacci

Упражнение 9.2.2: Комбинация нескольких TailRec

ru.scalabook.external_effects.TailRecExercises.sumFactorials

Упражнение 9.2.3: Взаимно рекурсивные функции

ru.scalabook.external_effects.TailRecExercises.isEven ru.scalabook.external_effects.TailRecExercises.isOdd

Раздел 9.3: Свободная монада

Упражнение 9.3.1: Реализация монадического интерфейса для

Free

ru.scalabook.external_effects.FreeExercises.Free.freeMonad

Упражнение 9.3.2: Реализация хвостово-рекурсивного интерпретатора

runTrampoline

ru.scalabook.external_effects.FreeExercises.Free.runTrampoline

Упражнение 9.3.3: Реализация универсального интерпретатора

run
для
Free[F, A]

ru.scalabook.external_effects.FreeExercises.Free.run ru.scalabook.external_effects.FreeExercises.Free.step

Упражнение 9.3.4: Реализация

translate

ru.scalabook.external_effects.FreeExercises.Free.translate

Упражнение 9.3.5: Реализация стекобезопасного

unsafeRunConsole

ru.scalabook.external_effects.FreeExercises.Console.unsafeRunConsole

Упражнение 9.4.1: Определение

step
для
Free[+F[_], A]

ru.scalabook.external_effects.CovaryFreeExercises.Free.step

Упражнение 9.4.2: Определение

run
для
Free[+F[_], A]

ru.scalabook.external_effects.CovaryFreeExercises.Free.run

Упражнение 9.4.3: Определение

runFree
для
Free[+F[_], A]

ru.scalabook.external_effects.CovaryFreeExercises.Free.runFree

Раздел 10.1: Локальные эффекты и изменяемое состояние

Упражнение 10.1.1: Реализация метода fill для STArray

ru.scalabook.local_effects.LocalEffectsExercises.STArray.fill

Упражнение 10.1.2: Реализация partition

ru.scalabook.local_effects.LocalEffectsExercises.partition

Упражнение 10.1.3: Реализация qs

ru.scalabook.local_effects.LocalEffectsExercises.qs

Раздел 11.1: Потоковая обработка и инкрементный ввод-вывод

Упражнение 11.1.1: Числа Фибоначчи

ru.scalabook.stream_processing.PullExercises.Pull.fib

Раздел 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

ru.scalabook.stream_processing.PullExercises.Pull.iterate

Упражнение 11.2.3: Реализация drop для Pull

ru.scalabook.stream_processing.PullExercises.Pull.drop

Упражнение 11.2.4: Реализация takeWhile для Pull

ru.scalabook.stream_processing.PullExercises.Pull.takeWhile

Упражнение 11.2.5: Реализация dropWhile для Pull

ru.scalabook.stream_processing.PullExercises.Pull.dropWhile

Упражнение 11.2.6: Реализация countViaMapAccumulate

ru.scalabook.stream_processing.PullExercises.Pull.countViaMapAccumulate

Раздел 11.3: Потоки

Упражнение 11.3.1: Реализация exists. Стратегия 1: Только конечный результат (остановка при нахождении)

ru.scalabook.stream_processing.PullExercises.Pipe.exists1

Упражнение 11.3.2: Реализация exists. Стратегия 2: Все промежуточные результаты (остановка при нахождении)

ru.scalabook.stream_processing.PullExercises.Pipe.exists2

Упражнение 11.3.3: Реализация exists. Стратегия 3: Все результаты (без остановки)

ru.scalabook.stream_processing.PullExercises.Pipe.exists3

Упражнение 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: Реализация конструктора

eval
для
Stream

ru.scalabook.stream_processing.EffectfulPulls.Stream.eval

Упражнение 11.4.2: Реализация метода

mapEval
для
Stream

ru.scalabook.stream_processing.EffectfulPulls.Stream.mapEval

Упражнение 11.4.3: Реализация генераторов

unfoldEval
для
Stream
и
Pull

ru.scalabook.stream_processing.EffectfulPulls.Pull.unfoldEval ru.scalabook.stream_processing.EffectfulPulls.Stream.unfoldEval