谁能解释一下函数式编程方面函数和方法之间的区别吗?
我通过 Scala 的案例研究来问这个问题
我们记下了两件事,即一个函数和一个做同样事情的方法
方法
def add(x:Int, y:Int):Int = x + y
功能
val addFunc:Function1[Int, Int] = (x,y) => x + y
我们可以看到它们都做了同样的事情,即添加 2 个整数。但是我们通过函数获得了一些额外的属性。
由于这是一个函数,因此将被视为第一类对象,如 Double、Float 等,可以作为值传递给任何其他函数或方法
我们可以将此函数存储在数据结构中,例如链接列表或 HashMap
这是不变性的完美示例,并保留了函数式编程世界的引用透明度,即我可以保证调用此函数 N 次我将始终得到相同的结果,因为这没有任何副作用。
这可以传递给更高阶的函数,例如映射或归约,并且不能做任何事情
这是一个类型依赖项,因为它明确指定了其类型,即 (Int => Int)
任何人都可以详细解释函数与命令式编程语言的方法相比可以提供的其他一些好处吗?
最佳答案
没有太多其他优点,但在函数式语言中,函数是一等公民(而方法不是)这一事实是一件大事。
如果一个函数可传递给其他函数,您就可以创建更高阶的函数,例如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(_+_)
即使在这个玩具示例中,它也更加简洁。了解我们如何将函数(奇数、平方、求和)传递给其他函数(过滤器、映射、归约)。
请注意,这不会给你新的权力:你不能做用其他非功能性方式不可能做的事情,只是更容易做到;)
关于scala - 函数式编程中函数和方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26993243/