The delay monad provides a way to introduce general recursion in type theory. To write programs that use a wide range of computational effects directly in type theory, we need to combine the delay monad with the monads of these effects. Here we present a first systematic study of such combinations.
We study both the coinductive delay monad and its guarded recursive cousin, giving concrete examples of combining these with well-known computational effects. We also provide general theorems stating which algebraic effects distribute over the delay monad, and which do not. Lastly, we salvage some of the impossible cases by considering distributive laws up to weak bisimilarity.
What Monads Can and Cannot Do with a Few Extra Pages 论文ID : 2311.15919标题 : What Monads Can and Cannot Do with a Few Extra Pages作者 : Rasmus Ejlers Møgelberg, Maaike Zwart分类 : cs.LO (Logic in Computer Science)发表时间/会议 : Logical Methods in Computer Science, Volume 21, Issue 4, 2025论文链接 : https://arxiv.org/abs/2311.15919 延迟单子(delay monad)提供了一种在类型理论中引入一般递归的方法。为了在类型理论中直接编写使用广泛计算效应的程序,我们需要将延迟单子与这些效应的单子结合起来。本文首次系统性地研究了这种结合。文章研究了余归纳延迟单子及其保护递归变体,给出了将这些单子与知名计算效应结合的具体例子。同时提供了一般性定理,说明哪些代数效应在延迟单子上分布,哪些不分布。最后,通过考虑弱双模拟下的分布律来挽救一些不可能的情况。
要解决的问题 : Martin-Löf类型理论要求所有程序终止以保持逻辑解释的正确性,但实际编程中需要一般递归。延迟单子通过封装递归解决了这个问题,但缺乏将延迟单子与其他计算效应系统结合的理论。问题的重要性 : 现代函数式编程语言需要处理多种计算效应(异常、状态、非确定性等)。在类型理论中直接编程和推理这些效应需要一个数学理论来描述延迟单子与其他单子的交互。现有方法的局限性 :缺乏延迟单子与其他单子结合的系统性研究 域理论中的相关结果过于复杂,不适用于类型理论设置 已知某些结合(如有限幂集单子)不可行,但缺乏一般性理论 研究动机 : 建立延迟单子与其他计算效应结合的完整数学理论,为在类型理论中进行高级函数式编程提供理论基础。系统性研究框架 : 首次对延迟单子与其他单子的结合进行系统性研究,涵盖余归纳和保护递归两种变体。具体结合示例 : 展示了延迟单子与标准计算效应(异常、读取器、全局状态、延续、选择)的具体结合方式。分布律的一般性定理 :证明了顺序分布对平衡方程的代数单子成立 证明了交换幂等操作的单子不存在分布律 建立了方程类型与分布律存在性的对应关系 弱双模拟理论 : 通过在集合范畴上工作,证明了在弱双模拟意义下可以为无丢弃方程的代数单子构造分布律。形式化验证 : 部分结果在Agda中形式化,提供了可验证的实现。研究分布律 TD → DT 的存在性,其中 T 是任意单子,D 是延迟单子。分布律将 T 的操作分布到计算步骤上,使复合 DT 具有单子结构。
保护递归延迟单子 D^κ: 定义为 D^κX ≃ X + ▷^κ(D^κX)余归纳延迟单子 D: 定义为 DX ≝ ∀κ.D^κX并行提升 (Definition 5.1):
op^par(now^κ x₁, ..., now^κ xₙ) = now^κ(op(x₁, ..., xₙ))
op^par(x₁, ..., xₙ) = step^κ(λα.op^par(x'₁, ..., x'ₙ))
顺序提升 (Definition 5.2):
op^seq(now^κ x₁, ..., now^κ xₙ) = now^κ(op(x₁, ..., xₙ))
op^seq(now^κ x₁, ..., step^κ xᵢ, ..., xₙ) = step^κ(λα.op^seq(now^κ x₁, ..., xᵢ[α], ..., xₙ))
线性方程 : 每个变量在等式两边恰好出现一次平衡方程 : 每个变量在等式两边出现次数相同复制方程 : 存在变量出现≥2次丢弃方程 : 等式两边变量集合不同保护递归编码 : 利用多时钟保护递归将余归纳类型编码为 ∀κ.D^κX,避免了连续性要求。分布律等价性 : 建立了分布律与Eilenberg-Moore范畴中单子提升的双射对应(Theorem 2.12)。方程驱动分析 : 通过代数理论的方程类型预测分布律的存在性,提供了系统性的分析框架。弱双模拟范畴 : 在集合范畴上工作以处理商结构,克服了直接商化延迟单子的技术困难。构造性证明 : 对存在性结果给出显式构造反例构造 : 对不可能性结果构造具体反例保护递归 : 使用保护递归进行归纳证明形式化验证 : 在Agda中实现部分结果Boom层次单子 : 二元树、列表、多重集合、幂集单子概率分布单子 : 有限概率分布单子计算效应单子 : 异常、读取器、状态、延续、选择单子适用范围 : 仅含平衡方程的代数理论成功案例 : 二元树单子、列表单子、多重集合单子数学证明 : 顺序提升保持平衡方程 (Proposition 5.6)核心定理 : 具有交换幂等二元操作的单子不存在分布律 TD^κ → D^κT具体反例 :
有限幂集单子 (Proposition 6.3) 有限概率分布单子 (Proposition 6.4) 技术关键 : 通过保护递归构造矛盾,利用步数计算错误适用条件 : 无丢弃方程的代数理论技术手段 : 在集合范畴上定义弱双模拟关系 ∼_R理论意义 : 证明了并行提升在弱意义下总是可行的线性方程 : 总是允许分布律(已知结果)平衡方程 : 允许顺序分布律幂等方程 : 阻止所有分布律丢弃方程 : 阻止并行分布律,但在弱双模拟下可行并行提升 : 不定义分布律(Theorem 5.5),但在弱双模拟下可行顺序提升 : 对平衡方程定义分布律,但不适用于幂等操作-- 状态单子与延迟单子: (D^κ(S × −))^S
lookup^DS : ((D^κ(S × X))^S)^S → D^κ(S × X)^S
update^DS : D^κ(S × X)^S → (D^κ(S × X))^S
step^DS : ▷^κ((D^κ(S × X))^S) → (D^κ(S × X))^S
幂集单子的反例核心在于:
step(x) ∪ step(x) = step(x ∪ x) = step(x) ≠ step²(x)
这导致步数计算不一致,违反了分布律的乘法公理。
延迟单子起源 : Capretta (2005) 引入余归纳延迟单子保护递归 : Nakano (2000) 的固定点模态,Atkey & McBride (2013) 的编码技术单子组合 : Beck (1969) 的分布律理论,Manes & Mulry (2007) 的系统研究交互树 : Xia et al. (2019) 的实用框架首次系统研究 : 延迟单子与其他效应的结合保护递归优势 : 相比余归纳版本的技术优势方程驱动方法 : 通过代数方程预测分布律存在性弱双模拟理论 : 挽救不可能情况的新方法分类定理 : 建立了方程类型与分布律存在性的完整对应关系构造方法 : 提供了具体的分布律构造(顺序提升)和反例构造理论边界 : 明确了哪些情况可能,哪些不可能实用价值 : 为类型理论中的效应编程提供理论基础有限元数 : 仅考虑有限元数操作,可数选择等需要进一步研究弱双模拟复杂性 : 需要在集合范畴中工作,增加了技术复杂度CCTT依赖 : 结果在Clocked Cubical Type Theory中证明,向Set的提升需要额外工作可数操作 : 扩展到可数元数操作如可数非确定性选择高阶效应 : 研究更复杂的计算效应实用库 : 基于理论结果开发实用的效应编程库其他类型理论 : 在其他类型理论设置中验证结果理论完整性 : 建立了延迟单子组合的完整理论框架方法新颖 : 保护递归方法相比传统域理论方法更简洁分类精确 : 通过方程类型精确预测分布律存在性案例丰富 : 涵盖了主要的计算效应单子证明严格 : 构造性证明和反例构造都很严格形式化 : 部分结果在Agda中形式化验证理论深度 : 不仅给出结果,还解释了背后的数学原因实用价值 : 为类型理论编程提供直接指导一般性 : 结果适用于广泛的代数理论类别技术依赖 : 重度依赖CCTT的特殊特性范围限制 : 仅处理有限元数操作复杂度 : 弱双模拟方法增加了不必要的复杂性理论性强 : 距离实际编程应用还有距离工具支持 : 缺乏基于理论的实用工具学习曲线 : 需要深厚的范畴论和类型理论背景填补空白 : 首次系统研究重要但被忽视的问题方法论 : 为类似问题提供了分析方法理论基础 : 为未来的效应编程研究奠定基础编程指导 : 为函数式编程语言设计提供理论指导验证工具 : 为程序验证提供数学基础教育价值 : 展示了范畴论在计算机科学中的应用类型理论研究 : 需要在类型理论中处理计算效应的研究函数式编程 : 设计支持多种效应的函数式语言程序验证 : 需要对带效应程序进行形式验证的场景理论计算机科学 : 研究计算效应的理论性质本文引用了69篇重要文献,涵盖了类型理论、范畴论、计算效应等多个领域的经典工作,特别是Beck (1969)的分布律理论、Capretta (2005)的延迟单子、以及Nakano (2000)的保护递归等奠基性工作。