Чем полезны конструкции функционального программирования в языках с несколькими парадигмами? - PullRequest
0 голосов
/ 11 июля 2020

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

Однако мне интересно, какова цель конструкций функционального программирования в многопарадигмальных языках, которые в основном не работают. Например, в Python есть такие вещи, как map, filter, lambda, reduce, но большинство из них считаются «не-Pythoni c» (в отличие от понимания списков, которые могут быть считается функциональным я думаю). Функции могут считаться объектами в python, но, кроме того, это похоже на язык OOP.

Даже в таких языках, как Scala, нет никакой гарантии, что функция будет чистой / функциональный, и он может быть в стиле OOP (как бы он ни был, когда вы загружаете библиотеку java). Вам нужно будет прочитать каждую функцию, чтобы определить, чистая она или нет.

Итак, мой вопрос остается: какова цель конструкций FP в многопарадигмальных языках?

1 Ответ

1 голос
/ 12 июля 2020

Я использую конструкции FP в java для обработки большого количества данных, например: вы получаете список целых чисел и должны применить следующие операции:

  1. Удалить нечетные числа
  2. Удалите каждое число, которое встречается дважды
  3. Сопоставьте каждое число с квадратом root
  4. Сортируйте их в порядке возрастания.
  5. Возвратите его как список двойных значений В Java, с Streams вы можете:
public List<Double> applyOperations(List<Integer> ints){
  return ints.stream()
             .filter(a->a%2==0)
             .distinct()
             .map(Math::sqrt)
             .sorted()
             .collect(Collectors.toList());
}

по сравнению с

public List<Double> applyOperations(List<Integer> ints){
  Set<Integer> evenNumbers=new HashSet<>();
  for(Integer i:ints){
    if(i%2==0){
      evenNumbers.add(i);
    }
  }
  List<Double> doubles = new ArrayList<>();
  for(Integer i:evenNumbers) {
    doubles.add(Math.sqrt(i));
  }
  Collections.sort(doubles);
  return doubles;
}

Первый из них намного более читабелен и элегантен, чем последний.

...