我已经阅读了一些关于声明式/函数式编程(语言)的文章,尝试过 Haskell 以及自己编写的一篇。从我所见,函数式编程比经典的命令式编程有几个优点:
生产力提高(例如:Erlang)
命令式编程是一个非常古老的范例(据我所知),可能不适合 21 世纪
为什么使用函数式语言或编写程序的公司仍然如此“罕见”?
为什么在查看函数式编程的优势时,我们仍在使用命令式编程语言?
也许在 1990 年还为时过早,但今天呢?
因为所有这些优点也是缺点。
无状态程序;无副作用
现实世界的程序都是关于副作用和突变的。当用户按下按钮时,是因为他们想要某事发生。当他们输入某些内容时,他们希望该状态取代曾经存在的任何状态。当会计部门的简·史密斯结婚并改名为简·琼斯时,支持打印她的工资支票的业务流程的数据库最好全部用于处理这种突变。当你用机关枪对着外星人开火时,大多数人不会在脑海中将其视为建造一个生命值较低的新外星人。他们将其建模为现有外星人属性的突变。
当编程语言概念从根本上与被建模的领域相矛盾时,很难证明使用该语言是合理的。
并发;与新兴的多核技术配合得非常好
问题只是被推来推去。使用不可变数据结构,您可以以可能处理陈旧数据为代价获得廉价的线程安全性。使用可变数据结构,您可以始终处理新数据,但代价是必须编写复杂的逻辑以保持数据的一致性。这并不像其中一个明显比另一个更好。
程序通常更短,在某些情况下更易于阅读
除非它们更长且更难阅读。学习如何阅读以函数式风格编写的程序是一项艰巨的技能。人们似乎更善于将程序设想为一系列要遵循的步骤,就像一个食谱,而不是一系列要执行的计算。
为了证明雇用知道如何以函数式编程的程序员的巨额费用,生产力必须提高很多。
记住,你不想丢掉一个工作系统;大多数程序员不是从头开始构建新系统,而是维护现有系统,其中大部分是用非函数式语言构建的。想象一下,试图向股东证明这一点。为什么你要放弃现有的工作工资系统,以花费数百万美元建造一个新系统?“因为函数式编程很棒”不太可能让股东高兴。
命令式编程是一种非常古老的范式(据我所知),可能不适合 21 世纪
函数式编程也很古老。我不明白这个概念的时代是如何相关的。
不要误会我的意思。我喜欢函数式编程,我加入这个团队是因为我想帮助将函数式编程的概念带入 C#,我认为不可变风格的编程是未来的发展方向。但是,不能简单地希望以函数式编程方式进行编程 需要付出巨大的代价。 在几十年的时间里,向更实用的风格转变将缓慢而逐渐地发生。它将是这样的:向更实用的风格转变,而不是全面拥抱 Haskell 的纯洁和美丽并放弃 C++。
我以构建编译器为生,我们肯定会接受下一代编译器工具的函数式风格。这是因为函数式编程从根本上很好地解决了我们面临的各种问题。我们的问题都是关于获取原始信息——字符串和元数据——并将它们转换成不同的字符串和元数据。在发生突变的情况下,比如有人在 IDE 中打字,问题空间固有地适用于功能技术,例如仅增量重建树中发生变化的部分。 许多域没有这些使它们明显适合功能样式的良好属性 。