函数编程方面的函数和方法之间的差异

时间:2014-11-18 11:29:45

标签: scala functional-programming

任何人都可以解释函数编程方面的函数和方法之间的区别。

我通过Scala案例研究提出这个问题

我们记下2件事,即功能和做同样事情的方法

方法

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

功能

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

我们可以看到它们都做同样的事情,即添加2个整数。但是我们通过函数获得了一些额外的属性。

  1. 因为这是一个函数,所以它将被视为一个第一类对象,如Double,Float等,可以作为值传递给任何其他函数或方法

  2. 我们可以将此函数存储在数据结构中,例如alinked List或HashMap

  3. 这是一个完美的不变性示例,并保留了函数式编程世界的参考透明度,即我可以保证调用此函数N次我会得到相同的结果,因为这没有任何副作用。

  4. 这可以传递给更高阶的函数,例如map或reduce,并且可以做N no no

  5. 这是一个类型依赖,因为它明确指定了它的类型,即(Int => Int)

  6. 与命令式编程语言中的方法相比,任何人都可以详细解释函数可以提供的其他一些好处吗?

2 个答案:

答案 0 :(得分:1)

没有太多其他优点,但功能语言功能是一等公民(而方法不是)的事实是一个大问题。

如果函数可以传递给其他函数,则可以创建更高阶函数,如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(_+_)

即使在这个玩具示例中也更加简洁。看看我们如何将函数(奇数,平方,和)传递给其他函数(filter,map,reduce)。

请注意,这并没有给你新的权力:你不能做其他非功能性方面无法做到的事情,只是更容易做到;)

答案 1 :(得分:-3)

当然,并不是说我们不能在Java或C等命令式编程语言中做这些事情。但是我们可以在功能语言中以更抽象的方式完成它们,因为它提供了更强大的抽象。事实是我们指定在命令式编程语言中做什么以及如何做,而我们只指定在函数方面做什么。函数应该通过隐藏实现细节来确定如何做的方式。优点是我们不玩与变量的状态一样,因为所有状态在由lambda演算定义的纯函数中是不可变的。因此,我们不会以错误的结果结束,我们可能最终会以命令式语言风格结束