函数式编程的常见误区
1. 最后一行为什么作为返回值?
返回值这种说法并不是很好, 它应该叫做结果值, 因为函数式编程的核心为一切都是表达式, 一切都是表达式求值的结果, 而函数就是作为一种表达式被求值, 那么最后一行就是整个函数求值之后的结果。
1 | expr = x => x |
观察上面这个表达式x, 这个表达式其实就是变量x, 所以变量也是一种表达式。
2. 到底什么是真正的纯函数?
很多的函数式编程语言都强调自己是纯函数编程语言,比如haskell, 号称有状态的编程语言都不是纯函数式语言, 无状态有些条件下是有益处的, 比如在并发编程中, 如果一个值无法改变, 我们就很好解决线程切换导致的原子性问题了。
但是在现实编程环境中, 状态是无处不在的, 我们应该勇敢的承认这个世界不是纯的, 如果一味的追求纯函数, 那么只会固步自封, 比如有很多编程语言喜欢将赋值操作返回一个值, 其实这种做法本身就是有问题的, 因为赋值操作仅仅是对变量值进行修改, 只是一种行为操作。
1 | //这样的写法真的对人造成很大困惑 |
3. 使用不纯的语言写出纯函数?
其次我们可以使用任何的编程语言写出纯函数的代码? 比如下面这段程序:
1 | function add(a) { |
看到了么, 这种赋值操作仅仅发生在add函数中, 并不会泄漏到add函数的外部, 这种局部状态的改变完全是可行的。
4. 理性看待
我觉的函数式编程语言最大的贡献主要有两个,
- 强调了函数在编程中的作用: 理解函数这个概念对新学习编程语言语言的人来说是非常重要的, 因为它是最基本的抽象, 也是让你可以写出模块化程序的最简单的方式。
- 将函数作为一种值参与计算: 这种行为导致函数式编程语言与并发编程天生适配。