高阶函数 — 把「做什么」当参数传
这一章讲三件事: 为什么「词汇表与问题对应」的程序更可能对; 高阶函数怎么把「动作」抽象出来(filter/map/reduce 三板斧从哪来); 以及组合这些小函数写出的管道长什么样、要付什么代价。 读完你能看懂任何一条
xx.filter(…).map(…).reduce(…)链在做什么。
1. 先看现象:一行的程序为什么更可能对
导论里留过一个问题,这里正面回答。同一件事(1 加到 10)两种写法:六行的 while 循环,和一行 console.log(sum(range(1, 10)))。把 sum 和 range 的定义都算进去,第二种反而更大——但作者断言它更可能没有 Bug,理由是:它用的词汇表与问题对应。求和这件事,本来就不是关于循环和计数器的,是关于范围与和的1。
sum/range 的定义内部当然还有循环,但它们各自表达的概念更简单,所以更容易写对2。
这类「编程里的词汇表」有个正式名字:抽象(abstraction)——让我们在更高的高度谈问题,不被无趣细节绊住。书里用两份豌豆汤菜谱打比方:第一份逐步教你「拿刀切」,第二份直接写「soak、simmer、chop」——更短,但你得先会那几个词。编程里没人给你现成词典,所以常掉进第一份菜谱的写法;有用的本事是察觉自己正在过低的抽象层上干活3。