编程是一项复杂的活动,需要非常注重细节。这些细节在抽象层次上可能有很大差异,从非常低的抽象层次(例如,原始数据类型强制)到非常高的抽象层次(例如,算法和启发式选择)。维护所有这些细节可能非常繁重,会产生大量无关的认知负担。出于这些原因和其他原因,人们长期以来一直在尝试教学生规划解决方案。原则上,计划可以专注于高级解决策略,避免一些低级实现细节。通过将解决方案抽象为这些策略,还应该更容易识别解决方案之间的相似之处,并且可能将知识从一个问题转移到另一个问题。不幸的是,几十年来,有关规划和计划制定的文献并没有取得太大进展。从降雨问题 [ 34 ] 开始的研究发现学生无法解决问题,焦点转移到学生的困难而不是学生的计划上。直到最近几年,我们才看到学生成功解决了这个问题 [ 10 , 33 ] 和其他类似问题 [1, 12]。这些最近的成功案例主要要求学生编写程序并追溯学生使用的结构。相比之下,我们明确地回到了这个问题的根源,要求学生预先规划解决方案。具体来说,我们为他们提供了一套规划原语工具包,并要求他们将其组合成解决方案结构。我们可以提供什么原语?作为起点,我们选择使用内置的高阶函数 (hofs)。这种选择没有什么规范可言——人们也可以选择不同的起源。然而,我们选择它们有几个原因: