多范式语言中的函数式编程构造有何用处?
How are functional programming constructs in multi-paradigm languages useful?
在像 Haskell
这样的纯函数式编程语言中,纯粹性和函数式编程的结合带来了很好的特性,即所有函数都没有副作用,因此更容易推理、抽象和调试、测试等
但是,我想知道在主要不是函数式的多范式语言中构造函数式编程的目的是什么。例如,Python
有 map
、filter
、lambda
、reduce
之类的东西,但这些东西中的大多数被认为是“非 Pythonic”(相反列出理解,我猜这可能被认为是功能性的)。函数在 python
中可以被认为是对象,但除此之外,它看起来几乎是一种 OOP 语言。
即使在像 Scala
这样的语言中,也不能保证函数是 pure/functional,而且它很可能是 OOP 风格的(当你加载一个java
图书馆,无论如何)。您需要通读每个函数以确定它是否纯正。
所以我的问题仍然存在:多范式语言中 FP 构造的目的是什么?
我在 java 中使用 FP 构造来处理大量数据,例如:
您将获得一个整数列表,并且必须应用以下操作:
- 去掉奇偶数
- 删除出现两次的每个数字
- 将每个映射到平方根
- 按升序排列。
- Return 它作为双打列表
在 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;
}
第一个比后一个更具可读性和优雅性。
在像 Haskell
这样的纯函数式编程语言中,纯粹性和函数式编程的结合带来了很好的特性,即所有函数都没有副作用,因此更容易推理、抽象和调试、测试等
但是,我想知道在主要不是函数式的多范式语言中构造函数式编程的目的是什么。例如,Python
有 map
、filter
、lambda
、reduce
之类的东西,但这些东西中的大多数被认为是“非 Pythonic”(相反列出理解,我猜这可能被认为是功能性的)。函数在 python
中可以被认为是对象,但除此之外,它看起来几乎是一种 OOP 语言。
即使在像 Scala
这样的语言中,也不能保证函数是 pure/functional,而且它很可能是 OOP 风格的(当你加载一个java
图书馆,无论如何)。您需要通读每个函数以确定它是否纯正。
所以我的问题仍然存在:多范式语言中 FP 构造的目的是什么?
我在 java 中使用 FP 构造来处理大量数据,例如: 您将获得一个整数列表,并且必须应用以下操作:
- 去掉奇偶数
- 删除出现两次的每个数字
- 将每个映射到平方根
- 按升序排列。
- Return 它作为双打列表 在 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;
}
第一个比后一个更具可读性和优雅性。