1. 最后一行为什么作为返回值?

返回值这种说法并不是很好, 它应该叫做结果值, 因为函数式编程的核心为一切都是表达式, 一切都是表达式求值的结果, 而函数就是作为一种表达式被求值, 那么最后一行就是整个函数求值之后的结果。

1
expr = x => x

观察上面这个表达式x, 这个表达式其实就是变量x, 所以变量也是一种表达式。

2. 到底什么是真正的纯函数?

很多的函数式编程语言都强调自己是纯函数编程语言,比如haskell, 号称有状态的编程语言都不是纯函数式语言, 无状态有些条件下是有益处的, 比如在并发编程中, 如果一个值无法改变, 我们就很好解决线程切换导致的原子性问题了。

但是在现实编程环境中, 状态是无处不在的, 我们应该勇敢的承认这个世界不是纯的, 如果一味的追求纯函数, 那么只会固步自封, 比如有很多编程语言喜欢将赋值操作返回一个值, 其实这种做法本身就是有问题的, 因为赋值操作仅仅是对变量值进行修改, 只是一种行为操作。

1
2
//这样的写法真的对人造成很大困惑
if (x = 2) {}

3. 使用不纯的语言写出纯函数?

其次我们可以使用任何的编程语言写出纯函数的代码? 比如下面这段程序:

1
2
3
4
5
function add(a) {
let c = 2;
c = c * a;
return c;
}

看到了么, 这种赋值操作仅仅发生在add函数中, 并不会泄漏到add函数的外部, 这种局部状态的改变完全是可行的。

4. 理性看待

我觉的函数式编程语言最大的贡献主要有两个,

  • 强调了函数在编程中的作用: 理解函数这个概念对新学习编程语言语言的人来说是非常重要的, 因为它是最基本的抽象, 也是让你可以写出模块化程序的最简单的方式。
  • 将函数作为一种值参与计算: 这种行为导致函数式编程语言与并发编程天生适配。