Functional programming中函数与方法的区别

28 浏览
0 Comments

Functional programming中函数与方法的区别

这个问题已经有了答案:

函数和方法的区别是什么?

Scala中方法和函数的区别是什么?

请有人解释一下函数和方法在函数式编程方面的区别。

我用Scala的案例来问这个问题。

我们已经记录了两件事,即函数和方法都做同样的事情。

方法

def add(x:Int, y:Int):Int = x + y

函数

val addFunc:Function1[Int, Int] = (x,y) => x + y

我们可以看到它们都做同样的事情,即两个整数的加法。但是函数提供了一些附加属性。

  1. 由于它是一个函数,因此它将被视为一级对象,如Double,Float等,可以作为值传递给任何其他函数或方法
  2. 我们可以在数据结构中存储此函数,例如链接列表或哈希映射表
  3. 这是不可变性的完美示例,并保持函数式编程世界中的引用透明性,即我可以保证每次调用此函数N次,我将始终获得相同的结果,因为它没有任何副作用。
  4. 可以将其传递给高阶函数,例如map或reduce,并且可以做N个事情
  5. 这是类型依赖的,因为它明确指定了其类型,即(Int=>Int)

有人能详细解释一下函数与命令式编程语言中的方法相比提供的其他好处吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

并不是非常多其他的优势,但是在函数式编程语言中,函数是一等公民(方法不是)这一点是非常重要的。

如果一个函数可以传递给其他函数,你就有了创建高阶函数,比如 map、filter 或 reduce 的可能性,比其他非函数式做法要简洁得多。

例如,让我们求一个列表中所有奇数的平方和:

在非函数式语言中,你会得到像下面这样的代码(注意:这是伪代码):

List[Int] list = new List(1, 2, 3, 4, 5, 6, 7, 8, 9);
Int acc = 0;
for (Int x: list) {
  if (x % 2 != 0) {
    acc += Math.Pow(x, 2);
  }
}

而在函数式 Scala 代码中,你可以写成:

val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
val acc = list.filter(_%2!=0).map(x=>x*x).reduce(_+_)

即使在这个玩具示例中,也要简洁得多。请注意,我们是如何将函数(odd、square、sum)传递给其他函数(filter、map、reduce)的。

请注意,这并没有给你带来新的能力:你不能做其他非函数式方式无法做到的事情,只是更容易做到而已 😉

0