【问题标题】:Difference between a function and a method in terms of Functional programming [duplicate]就函数式编程而言,函数和方法之间的区别[重复]
【发布时间】:2015-01-15 13:52:27
【问题描述】:

谁能解释一下函数式编程方面函数和方法之间的区别。

我通过一个 Scala 的案例研究来问这个问题

我们记下了两件事,即一个函数和一个做同样事情的方法

方法

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

功能

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

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

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

  2. 我们或许可以将此函数存储在数据结构中,例如链表或哈希映射

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

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

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

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

【问题讨论】:

标签: scala functional-programming


【解决方案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(_+_)

即使在这个玩具示例中也更加简洁。看看我们如何将函数(奇数、平方、求和)传递给其他函数(过滤器、映射、归约)。

请注意,这并没有赋予你新的权力:你不能做其他非功能性方式不可能做的事情,它只是更容易做到;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2013-02-14
    • 2022-07-05
    • 2018-05-06
    • 2011-10-06
    • 2020-03-05
    • 2011-03-11
    相关资源
    最近更新 更多