一句话:提出一阶惰性构造子,将惰性数据结构中的 thunk 去功能化,从而提升性能并便于调试。
在严格语言中,惰性求值通常用显式 thunk 模拟:闭包延迟计算并记忆结果。但闭包实现的 thunk 难以打印和调试,需要额外内存分配,有时性能较差,且性能推理非常微妙,阻碍了惰性数据结构的广泛使用。本文提出 lazy constructors(惰性构造子),作为 lazy thunks 的简单一阶替代。其核心思想是让惰性数据结构中的 thunk 去功能化(defunctionalized),用数据构造子而非闭包表示未求值计算。这样得到的实现不仅显著快于传统 thunk,还能被轻松检查和打印,便于调试。论文展示了该机制如何用于实现惰性数据结构,并比较其性能与可观察性。
In strict languages, laziness is typically modeled with explicit thunks that defer a computation until needed and memoize the result. Such thunks are implemented using a closure. Implementing lazy data structures using thunks thus has several disadvantages: closures cannot be printed or inspected during debugging; allocating closures requires additional memory, sometimes leading to poor performance; reasoning about the performance of such lazy data structures is notoriously subtle. These complications prevent wider adoption of lazy data structures, even in settings where they should shine. In this paper, we introduce lazy constructors as a simple first-order alternative to lazy thunks. Lazy constructors enable the thunks of a lazy data structure to be defunctionalized, yielding implementations of lazy data structures that are not only significantly faster but can easily be inspected for debugging.
@article{paperbot3040,
title = {First-Order Laziness},
author = {Anton Lorenzen and Daan Leijen and Wouter Swierstra and Sam Lindley},
journal = {Proceedings of the ACM on Programming Languages},
volume = {9},
number = {ICFP},
year = {2025},
doi = {10.1145/3747530}
}