Рубрики
Без рубрики

Частичные функции в Scala

Написание функций и методов, которые обрабатывают входные данные и производят некоторый вывод, является самой сутью… Помеченный scala, java, jvm, функциональный.

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

Что такое Частичная функция?

Частичная функция типа Частичная функция[A, B] является унарной функцией, в которой домен не обязательно включает все значения типа A . Стандартная библиотека Scala

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

По сути, частичная функция – это функция, которая принимает только определенный набор данных в качестве входных данных. Это не означает, что функция принимает только целые числа, а не строки — такое поведение является стандартным элементом любой функции. Частичная функция, которая принимает целочисленный параметр в качестве входных данных, может указать, какие точные целые числа принимаются.

Чтобы лучше понять концепцию, давайте рассмотрим несколько примеров кода.

Как написать частичную функцию

Во-первых, давайте напишем стандартную функцию, которая принимает любой ввод типа Int:

   val standardFunction = (x: Int) => x % 10

Стандартная функция | похожа на любую другую - принимает параметр и возвращает остаток при делении на 10. Теперь, что, если разработчик передаст ноль в качестве параметра? Или нам нужны еще более уточненные ограничения в отношении параметра? Одним из способов было бы написать длинный блок "если" и "еще", но это не то, что вы хотели бы сделать. Вместо этого давайте напишем частичную функцию, например:

    val partialFunction: PartialFunction[Int, Int] = {
        case 1 => 100
        case 2 => 120
        case 3 => 130
      }

Приведенная выше частичная функция определяется с использованием признака PartialFunction[Int, Int] . Параметры типа указывают, что как входные, так и выходные данные будут иметь тип Int. Как вы можете видеть, эта функция принимает только три параметра: 1, 2 или 3. Для любого другого параметра будет выдано исключение.

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

    partialFunction.isDefinedAt(67)

определяется в() – этот метод позволяет проверить, будет ли частичная функция принимать определенный параметр – в нашем случае 67 не будет принято, и метод вернет false.

    partialFunction.lift

lift – этот метод преобразует возвращаемый тип в Параметр . Для нашей частичной функции это будет Опция[Int] .

    partialFunction orElse otherPartialFunction

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

Существует множество других доступных методов — обязательно ознакомьтесь с официальными документами .

Карта против сбора

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

    List(1, 2, 3, 4, 5).map(partialFunction)

Первые три параметра в порядке — функция PartialFunction имеет определенный вывод для них. Но что происходит с параметрами 4 и 5? Ответ таков: Ошибка совпадения . Функция map не может определить выходные данные и выходит из строя.

Решение этой проблемы заключается в использовании метода сбора. Этот метод использует метод isDefinedAt перед применением функции сопоставления, что позволяет избежать ошибки Совпадения .

    List(1, 2, 3, 4, 5).collect(partialFunction)

Резюме

Я надеюсь, что вы нашли этот пост полезным. Если да, то не стесняйтесь ставить лайк или делиться этим постом. Кроме того, вы можете следить за мной в моих социальных сетях, если вам так хочется 🙂

Оригинал: “https://dev.to/bartoszgajda55/partial-functions-in-scala-4152”