【问题标题】:How are functional programming constructs in multi-paradigm languages useful?多范式语言中的函数式编程结构如何有用?
【发布时间】:2020-11-01 04:58:36
【问题描述】:

在像Haskell这样的纯函数式编程语言中,纯粹性和函数式编程的结合产生了很好的特性,即所有函数都没有副作用,因此更容易推理、抽象、调试、测试等.

但是,我想知道在主要不是功能性的多范式语言中构造函数式编程的目的是什么。例如,Python 有诸如 mapfilterlambdareduce 之类的东西,但这些东西中的大多数都被认为是“非 Pythonic”(与列表推导相反,它可能被认为是功能性的)猜测)。在python 中,函数可以被视为对象,但除此之外,它看起来更像是一种 OOP 语言。

即使在像 Scala 这样的语言中,也不能保证函数是纯函数/函数式的,而且它很可能是 OOP 风格的(就像你加载 java 库时一样,无论如何)。您需要通读每个函数以确定它是否为纯函数。

所以我的问题仍然存在:FP 构造在多范式语言中的目的是什么?

【问题讨论】:

  • 我已经就这个主题写了一整封course。即使编译器可能不会强制执行某些属性(或者根本没有编译器),因此无法保证这些属性适用于您的程序,但它仍然更加可靠和可预测。此外,您还可以实现无与伦比的代码重用程度。当然,这是基于意见的。

标签: functional-programming programming-languages


【解决方案1】:

我在java中使用FP构造来处理大量数据,例如: 你得到一个整数列表,并且必须应用以下操作:

  1. 去除奇数
  2. 删除每个出现两次的数字
  3. 将每一个映射到平方根
  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;
}

第一个比后一个更具可读性和优雅。

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多