Push Ifs Up and Fors Down: The Idiom, Its Algebra, and Its Limits
a day ago
- 习语'上移条件,下推循环'建议将条件逻辑上移到调用者,将迭代循环下推到批处理,以提高清晰度和性能。
- 在TigerBeetle中,将控制流集中到父函数,同时将无分支逻辑移到辅助函数,体现了这一习语。
- matklad的示例:用调用者处理`None`且被调用者接受普通`Walrus`的方式替换`frobnicate(Option<Walrus>)`;同时用执行紧密循环的批处理函数`frobnicate_batch`替换循环调用。
- 在数据库查询优化中,该原则体现为尽早下推投影和选择(沿树向下),并延迟连接(向上),类似于'上移条件'和'下推循环'。
- 数据库中的向量化执行(批处理)是'下推循环'的对应部分,减少了每次调用的开销。
- 在范畴论中,上移条件对应将输入限制为子对象(例如使用类型而非`Option`),从而消除分支。
- filter/map法则`filter p . map f == map f . filter (p . f)`展示了何时重新排列操作是有效的;当复合谓词简化时,它能节省工作量。
- 重写的合法性取决于代数约束:循环不变条件、仅引用连接一侧的谓词等。