你认为函数式编程的好处是什么?它们如何适用于今天的程序员?
函数式编程和面向对象编程之间最大的区别是什么?
你认为函数式编程的好处是什么?它们如何适用于今天的程序员?
函数式编程和面向对象编程之间最大的区别是什么?
函数式编程的风格是描述你想要的东西,而不是如何获得它。例如:不会通过创建带有迭代器变量并遍历数组完成每个单元格操作的for循环,而是说等价于“此标签指向对此数组版本,在所有元素上执行了此函数。”
函数式编程将更基本的编程思想移入了编译器,例如列表推导和缓存。
函数式编程最大的好处是简洁性,因为代码可以更加精简。函数式程序不会创建一个迭代器变量来成为循环的中心,因此这种和其他类型的开销都可以从您的代码中消除。
另一个主要的优点是并发性,因为函数式编程更容易实现,并且编译器正在处理大部分以前需要手动设置状态变量(如循环中的迭代器)的操作。
在单处理器的情况下,可以看到一些性能优势,具体取决于程序的编写方式,因为大多数函数式语言和扩展都支持惰性求值。在Haskell中,您可以说“此标签表示包含所有偶数的数组”。这样的数组是无限大的,但您可以随时请求该数组的第100,000个元素,而不必在数组初始化时知道您将需要的最大值是多少。该值只会在需要时计算,不再进一步计算。
最大的好处是不同于你已经熟悉的。选择像Scheme这样的语言并学习如何用它解决问题,你将成为在已知语言中更加优秀的程序员。就像学习第二门人类语言一样。你可能会认为其他语言基本上只是你自己语言的变体,因为你没有可比性。接触其他语言,尤其是那些与你已经了解的内容不相关的语言,是有益的。
为什么函数式编程很重要
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
摘要
随着软件变得越来越复杂,良好的结构变得越来越重要。良好结构化的软件易于编写和调试,并提供了一组模块,可以在未来降低编程成本。
在本文中,我们展示了函数式语言的两个特性,即高阶函数和惰性求值,可以显著地促进模块化。举例来说,我们操纵列表和树、编写多个数值算法并实现了α-β启发式算法(一种用于游戏程序的人工智能算法)。我们得出结论,由于模块化是成功编程的关键,函数式编程为软件开发提供了重要的优势。
因此,一个很好的起点是尝试理解在命令式语言中不可能但在函数式语言中可能实现的一些事情。
如果你谈论可计算性,当然函数式编程和命令式编程之间没有任何互斥的部分(或者相反)。
不同编程范型的重点不是使以前不可能的事情变得可能,而是使以前难以完成的事情更容易。
函数式编程旨在让你更轻松地编写简洁、无错且可并行化的程序。
我认为需要函数式编程最实用的例子就是并发 - 函数式程序天然地线程安全,鉴于多核硬件的兴起,这是至关重要的。
函数式编程还增加了模块化 - 你经常会在命令式编程中看到太长的方法/函数 - 你几乎不会看到超过几行的函数。由于一切都是解耦的 - 可重用性大大提高,并且单元测试非常非常容易。
不必纠结于选择其中一种方式:使用类似C#3.0的语言可以混合使用各自最优秀的元素。面向对象可以用于类级别及以上的大规模结构,函数式风格可用于方法级别的小规模结构。
使用函数式风格可以编写清晰表达意图的代码,而不会与控制流语句等混淆。由于具有无副作用编程等原则,因此更容易推理代码并检查其正确性。
如果你还不了解函数式编程,学习它将为你提供更多解决问题的方法。
函数式编程是一种简单的泛化方式,将函数提升为一等值,而面向对象编程则用于大规模代码结构。然而,在某些重叠的地方,面向对象设计模式可以直接使用一等函数来表示,而且更加简洁。
许多语言都提供了函数式编程和面向对象编程,包括OCaml、C# 3.0和F#。
祝好, Jon Harrop。