这篇文章解释了为什么我坚持使用函数式编程,使用一个非函数式程序员可以理解的原理。
原因实际上非常简单:函数式编程习惯用法比其他编程范例(如过程性编程或面向对象编程)的习惯用法更持久、更可移植。要解释原因,我需要首先定义我理解的“函数式编程”的含义(无可否认,这是一个不精确且含糊的术语)。
我个人使用术语“函数式编程”来表示一种编程风格,即您尽可能地将自己限制在以下语言功能上:
这并不是说这些特性在我对函数式编程的定义中是被禁止的。可以将其定义为更多的“技术雷达”,其中前一组功能属于“采用”类别,而后一组功能属于“保留”类别。
那么,前者的“认可”特性与后者的“不鼓励”特性有何不同呢?批准的语言功能是“永恒的”。您总是需要数字、列表、字符串、函数、记录等。它们甚至不是特定于编程的:它们早于编程,并且源自优秀的老式数学。如果您的语言不支持这些特性中的一个或多个,您将在建模某些问题领域时遇到困难。
然而,一旦您使用函数式编程习惯用法来描述自己,您就会意识到,除了这些特性之外,您实际上不需要太多其他东西:
当您从这个角度看待事物时,您开始将其他编程习惯用法视为来来去去的装点门面;而不是软件工程学科的基础。
此外,使用“永恒的”原语可以培养一种比大多数编程风格更可移植的编程风格。大多数函数式编程习惯用法都可以移植到任何语言,除了递归和通用标记联合(并非所有语言都支持)。然而,函数式程序员学习如何将递归和标记的联合转换为其他语言中的等效习惯用法(例如,分别是循环和访问者模式)。但是,如果您试图将面向对象的习惯用法移植到非面向对象的语言,您将会遇到困难-同样,将命令式习惯用法移植到函数式编程语言也是如此。
这就是为什么我的技术雷达将函数式编程标记为“采用”,并将其他编程范例标记为“保留”。