0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Функции как значения первого класса

Научитесь определять функции и передавать их в качестве аргументов, возвращать их из других функций и сохранять в переменных.

«Функции как значения первого класса» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Функции как значения первого класса

Добро пожаловать в раздел «Основы функционального программирования»! В Scala функции — это не просто команды, а значения первого класса.

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

Присваивание функций переменным

Подобно тому как числу можно присвоить val, ему можно присвоить и функцию. Здесь greet становится переменной, содержащей нашу функцию.

Попробуйте запустить этот простой пример:

object Main {
  def main(args: Array[String]): Unit = {
    val greet = (name: String) => s"Hello, $name!"
    println(greet("Alice"))
  }
}

Анонимные функции (лямбды)

Фрагмент (name: String) => s"Hello, $name!" из предыдущей сцены — это анонимная функция, также называемая лямбда-выражением.

Это функция без имени, которую часто определяют непосредственно в месте использования. Она особенно удобна для быстрых и конкретных задач.

object Main {
  def main(args: Array[String]): Unit = {
    val add = (x: Int, y: Int) => x + y
    println(s"5 + 3 = ${add(5, 3)}")

    val subtract = (a: Int, b: Int) => a - b
    println(s"10 - 4 = ${subtract(10, 4)}")
  }
}

Функции как аргументы методов

Одна из самых мощных возможностей — передача функций в качестве аргументов другим функциям. Такие функции называются функциями высшего порядка.

Функция applyOperation ниже принимает два числа и ещё одну функцию op. Затем op используется для объединения чисел.

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val add = (a: Int, b: Int) => a + b
    val result = applyOperation(5, 3, add)
    println(s"Result of addition: $result")
  }
}

Понимание типов функций

Обратите внимание на сигнатуру типа op: (Int, Int) => Int в предыдущей сцене.

  • (Int, Int): это означает, что функция принимает два аргумента типа Int.
  • => Int: это означает, что функция возвращает значение типа Int.

У каждой функции есть тип, описывающий её входные и выходные данные. Это помогает Scala обеспечивать безопасность типов!

Лаконичная передача функций

Не всегда нужно сначала определять именованную функцию. Можно передать анонимную функцию непосредственно туда, где ожидается аргумент-функция.

Это делает код более компактным и понятным, особенно при выполнении простых операций.

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val result1 = applyOperation(10, 2, (a: Int, b: Int) => a * b)
    println(s"Multiplication: $result1")

    // Scala can often infer types, making it even shorter!
    val result2 = applyOperation(20, 4, (a, b) => a / b)
    println(s"Division: $result2")
  }
}

Функции как возвращаемые значения

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

Здесь makeMultiplier возвращает новую функцию, которая умножает входное значение на определённый множитель.

object Main {
  def makeMultiplier(factor: Int): Int => Int = {
    (x: Int) => x * factor
  }

  def main(args: Array[String]): Unit = {
    val multiplyByTwo = makeMultiplier(2)
    val multiplyByFive = makeMultiplier(5)

    println(s"5 * 2 = ${multiplyByTwo(5)}")
    println(s"10 * 5 = ${multiplyByFive(10)}")
  }
}

Понимание замыканий

Когда makeMultiplier возвращает функцию, эта функция «запоминает» значение factor, существовавшее в момент её создания. Это называется замыканием.

Даже после завершения выполнения makeMultiplier функция multiplyByTwo всё ещё «знает», что её множитель равен 2.

Преимущества функций первого класса

Почему так важно рассматривать функции как значения первого класса?

  • Гибкость: можно легко менять поведение, передавая разные функции.
  • Повторное использование: можно создавать универсальные функции, работающие с любой переданной функцией.
  • Лаконичность: код становится короче и выразительнее, особенно при использовании анонимных функций.
  • Функциональный стиль: это основа функционального программирования, позволяющая применять мощные шаблоны.

Проверьте свои знания

Давайте проверим, насколько хорошо вы поняли функции как значения первого класса.

object Main {
  def execute(x: Int, op: Int => Int): Int = op(x)

  def main(args: Array[String]): Unit = {
    val square = (n: Int) => n * n
    val result = execute(5, square)
    println(result)
  }
}

Функции как значения: повторение

Отличная работа! Вы изучили основную концепцию функций как значений первого класса в Scala.

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

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

Часто задаваемые вопросы

Урок «Функции как значения первого класса» бесплатный?

Да — полный текст урока «Функции как значения первого класса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Чему я научусь в уроке «Функции как значения первого класса»?

Научитесь определять функции и передавать их в качестве аргументов, возвращать их из других функций и сохранять в переменных. Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Функции как значения первого класса»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Функции как значения первого класса
  2. Функции высшего порядка и каррирование
  3. Неизменяемость и побочные эффекты
← Назад к Scala for Backend Engineering & Functional Programming