函数式编程风格#
命令式和声明式(Imperative & Declarative)#
在谈论 FP 范式这个陌生词汇之前,我想先聊些我们熟悉的。
1990年后,C 作为计算机教育的101课程,逐渐在中国高校中普及开来。这是一门典型的命令式语言,程序员使用运算,循环和跳转语句,作为汇编语言的抽象对硬件发出指令。这种范式还有一个名字更加广为人知“面向过程编程”。
现今,几乎所有常见的编程语言都支持这一范式,包括 Java, Python 和 C++ 等常见的面向对象语言。面向对象要求将数据和操作数据的行为封装在对象中,通过这些对象来组织代码。逻辑的封装与数据的抽象并未改变人们依赖显式控制流去操控程序的状态以实现功能。
不同于命令式的"你该那么做",声明式语言更关注“你该做什么”。
请允许我用 C# 举个例子:
(string name, int age)[] people = new[]
{
("Alice", 12),
("Bob", 5),
("Charlie", 35),
("David", 65),
("Eve", 40),
};我们需要在人群中筛选出成年者,并保存他们的姓名。
这是一个常见的命令式实现
string[] adults = new string[people.Length];
for(int i = 0; i < people.Length; i++)
{
if (people[i].age >= 18)
{
adults[i] = people[i].name;
}
}而声明式则是这样的写法
string[] adults = people
.Where(p => p.age >= 18)
.Select(p => p.name)
.ToArray();令人遗憾的是,虽然论述到本节时,一定会有读者疑惑于“命令式语言中的方法和声明式的‘做什么’有什么区别”,但鲜见讨论函数式编程的书对此做过解释。