JS为例子:为什么说函数式是最好的编程范式和自然思考逻辑?
一、函数式是思考问题的本来状态
函数式是完全符合人类自然思考习惯的范式,不仅当我们对着编辑器的时候在用函数式思考,当我们散步出去,也是无时无刻不在用函数式思考和解决任何问题。
倘若不考虑更加符合人类自然思考逻辑的递归思考方式recursive-function, 而只考虑“尾递归”的情况。概括一句话,函数式编程就是所有的一切思考都发生在 function (args-list) 的这个参数括号内,而无须下潜到第二行,陷足到 dirty-details 之中。
二、数鹅卵石的例子
比如经典的鹅卵石的例子:
*
* *
* * *
* * * *
问题是:求当有 n 层的时候,鹅卵石的总数?
如果一个儿童,他没学过高斯的求和方法,思考过程是这样的:
首先从变量出发,该题目中的变量只有一个就是层数 n,
而最终的结果是 total。
他的观察:
第一层,n = 1, total =1;
第二层,n = 2, total + 2;
第三层,n = 3, total + 3;
于是他就自然而然地写出了 (total+n, n+1, terminate) 这个式子。
然后将其命名为 triangle(total+n, n+1, terminate).
这就是SICP总结的iteration三要素:
1) 确定数目的变量,
2) 如何得到最终的结果,
3) 控制循环的terminate
三、用 JS 的实现
对 iteration 再提炼一步,第一项参数是生产最终结果的规则,后面两项控制循环,中间可能还有其他临时参数。
所有这一切都发生这个括号内(args),思考完毕,只须挪一步设置终止判断:
function triangle1(product, rowNumber, rows) {
return rowNumber > rows
? product
: triangle(product+rowNumber, rowNumber+1, rows);
}
然而,procedural-programming 的逻辑,却将自然流畅的思考拽进了琐碎的细节中。
function triangle1(rows) {
let [total, rowNumber] = [0, 1];
while (rowNumber <= rows) {
total = total + rowNumber;
rowNumber++;
}
return total;
}
第一行的参数(rows) 几乎只是一个摆设,你只能一头扎进黑匣子去思考问题,而且必然不可能在你走路的时候,用这套方法思考问题。
四、函数式是世界运行的底层逻辑
而函数式更底层的逻辑,input -> process --> output 就是这个世界的底层逻辑,工作是,管理是,计算机的结构也是。