Краткое вступление в композицию функций в Swift

1656639246 kratkoe vstuplenie v kompozicziyu funkczij v swift

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

Основная идея композиции функции состоит в применении одной функции к результату другой функции. Следовательно, это математическая концепция объединения функций в одну функцию.

1*QDF5FSC7IE8GxFd-Y5DbrQ
Композиция функции

Начинаем

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

f: A -> Bg: B -> C

Если мы делаем композицию этих двух функций, мы можем представить это как «gof» (вы можете сказать g из f).

(g o f): A -> C such that (g o f)(a) = g(f(a)) for all a in A

Давайте попробуем изучить это подробнее на простом примере:

Let f(a) = 2a + 3 & g(a) = 3a + 5, then function composition
(g o f)(a) = g(f(a)) = 3(f(a)) + 5 = 3(2a + 3) + 5 = 6a + 14

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

Знакомство со Swift как функциональным языком программирования

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

Реализация композиции функций в swift

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

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

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

Итак, давайте посмотрим, что происходит в приведенном выше блоке кода:

  1. Мы объявили специальный инфиксный оператор >>>. Он имеет левую ассоциативность и порядок приоритета, как и оператор+.
  2. Мы объявили функцию, имя которой совпадает с именем инфиксного оператора. Функция использует три генерика T, U, V и принимает два закрытия в качестве входных параметров.
  3. Левый параметр является закрытием, и он принимает вход типа T и возвращает выход типа U.
  4. Правый параметр также является закрытием, и он принимает вход типа U и возвращает выход типа V.
  5. Теперь функция >>> возвращает функцию или замыкание типа (T) → V. Выходное замыкание принимает вход типа T и возвращает вывод типа V. Здесь вывод левого параметра представляет собой ввод нужного параметра.
left :  (T) -> U right: (U) -> V
Output Type: (T) -> V

Если вы понимаете математическое представление композиции функции, то можете увидеть, что это точно так же с реализацией Swift.

6. В теле функции она возвращает результат правого параметра в левый параметр.

Теперь, если мы хотим получить тот же результат (квадратный массив уникальных четных целых чисел), мы можем сделать это с помощью композиции функции.

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

Спасибо, что читаете!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *