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

Репасандо Артикулос: Почему Функциональное Программирование Имеет Значение

Резюме одной из наиболее часто упоминаемых статей о функциональном программировании, где объясняются его основные преимущества, это первая в серии постов, посвященных различным научным статьям. Помеченный как обучающий, функциональный, java, испанский.

Д. Тернер, Аддисон-Уэсли, 1990

Со временем программное обеспечение увеличилось в сложности, и важность модульности для обеспечения качества становится все более очевидной и облегчить обслуживание кода, потому что небольшой модуль легче разрабатывать, повторно использовать и тестировать; однако модульность создает новую потребность, которая заключается в улучшении “glue code”, состоящего из код, используемый для объединения различных модулей. Основные преимущества функционального программирования направлены на улучшение модульности, облегчая повторное использование и тестирование каждого модуля благодаря ссылочной прозрачности и более эффективно объединяя их с реализацией функций более высокого порядка и ленивой оценки.

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

Справочная прозрачность

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

Функции более высокого порядка

Функции более высокого порядка-это те, которые получают или возвращают одну или несколько функций, что позволяет повторно использовать код и обобщение некоторых поведений для разных типов данных, которые должны переписывать только базовые функции, определяющие их конкретное поведение, а также более короткий и простой для понимания “glue code”. Основным примером функций более высокого порядка является функция foldLeft, которая позволяет объединить все элементы списка в один элемент результат многократного применения любой функции, которая получает в качестве параметра объекты типа элементов списка.

  public static void main(String[] args) {
      List list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
      Integer r = list.foldLeft(0, Integer::sum); // 45
  }


  //codigo de la funcion foldLeft tomado del código fuente de vavr
  default  U foldLeft(U zero, BiFunction f) {
        Objects.requireNonNull(f, "f is null");
        U xs = zero;
        for (T x : this) {
            xs = f.apply(xs, x);
        }
        return xs;
    }

Ленивая Оценка

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

  public static Function1 siguienteCandidato(Double n){
      /**
       * Formula para calcular la sucesión de candidatos a para la raíz cuadrada de n según el método de Newton-Raphson
       */
      return Function1.of((anterior) -> (anterior + (n / anterior)) / 2d);
  }

  public static Double calcularRaizCuadrada(Double n){
      Stream s = Stream.iterate(1d, siguienteCandidato(n));
      Double epsilon = 0.0001d; // Se utiliza para especificar la precisión
      return s.takeUntil(candidato -> Math.abs((candidato * candidato) - n) < epsilon).last();
  }

  public static void main(String[] args) {
      System.out.println(calcularRaizCuadrada(25d)); // 5.000023178253949
  }

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

Оригинал: “https://dev.to/gustavo94/repasando-artculos-why-functional-programming-matters—1l7i”