什么是函数式编程思维?

看好多帖子,愣是没明白。或者说没有文章能告诉我函数式编程帮我解决了什么问题. 举个例子,我看完"面向对象分析与设计"那本经典,我就能明白面向对象的方法…
关注者
8,440
被浏览
1,595,546
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

要判断一个东西算不算函数式编程, 或者说一门编程语言是不是FP语言, 只看 用到/有 哪些语法特性是不够的. 一切还需要回归到函数式编程的初衷来, 也就是: 希望可以允许程序员用计算来表示程序, 用计算的组合来表达程序的组合. 而非函数式编程则习惯于用命令来表示程序, 用命令的顺序执行来表达程序的组合.


如果在解决某个具体问题的过程中, 你的程序能完全用计算来表示, 你在组合程序的子部分得到最终程序的过程中, 使用的组合方式是计算的组合, 那么它就可以说是函数式编程, 而与你用的什么编程语言, 以及你在此过程中用到了哪些语言特性没有直接的关系.

比如, 用一个简单的例子:

程序1:

int a, b, r;
void add_abs() {
    scanf("%d %d", &a, &b);
    r = abs(a) + abs(b)
    printf("%d", r);
}


程序2:

int add_abs(int a, int b) {
    int r = 0;
    r += abs(a);
    r += abs(b);
    return r;
}


程序3:

int add_abs(int a, int b) {
    return abs(a) + abs(b);
}


程序1 是用命令来表示程序, 用命令的顺序执行来表示程序的组合, 不算函数式
程序2 是用函数来表示程序, 但在内部是用命令的顺序执行来实现, 不太函数式
程序3 是用函数来表示程序, 用函数的组合来表达程序的组合, 是完全的函数式编程

注意我们的判断标准关注的是程序在人(也就是程序员)脑中的状态, 它关心的是某个人在思考问题的时候, 程序是以什么样的概念存在于脑中的 -- 是指令的序列呢, 还是计算呢 -- 而跟程序在机器中执行的状态无关, 毕竟函数式的代码和非函数式的代码最终编译得到的机器码完全有可能是一样的. 所以这里重要的区别在于人如何理解程序, 而非程序如何执行.

所以对于某段代码算不算函数式编程这个问题, 我觉得这跟它用的什么编程语言并没有什么直接的关系 (比如我在程序3中用的同样是非函数式语言), 它跟问题本身有关, 跟具体的实现思路有关, 甚至具体到一个程序员, 它还跟这个程序员如何去解读这段程序有关 (比如当我把程序2中的add_abs看作黑盒的时候, 我忽略它的实现, 而在其它地方把它当做纯函数去使用, 它也完全可能成为函数式代码的一部分).


函数式编程思维, 就是用计算(函数)来表示程序, 用计算(函数)的组合来表达程序的组合的思维方式.