解法
Arnaud Spiwack 想在 Haskell 中表示层,但教科书定义带来了实际问题:筛子包含许多冗余的匹配信息表示,其依赖的拉回构造需要 Haskell 无法承受的依赖类型。字面翻译定义的直接方法会使非法状态可表示,并将程序淹没在不相关的数据中。
他首先围绕算术表达式构建了一个具体示例。一个预层可以沿着表达式拉回值,但期望的条件操作需要层在两个分支的布尔覆盖上进行胶合。因此,实现将胶合显式作为类型类操作,然后将其推广为 Site,其类型化的 Cover 和 Gen 族描述了哪些片段可以组装。
类型化的 site 去除了拉回筛子的负担:胶合可以在任何箭头处操作,生成器无需表示为实际箭头。乘积、指数、Yoneda 嵌入、余积和递归列表随后可以以相同风格定义。Sheafify 通过存储胶合操作而不是过早评估它们来实现自由层构造,而 PFun 携带指数所需的方差。
结果是一个演示仓库和一个 Haskell 形式的抽象思想实现,并非声称每个数学细节都消失了。Spiwack 明确保留不动点未解决,但项目将定义从对语言过于宽松转化为类型化的可操作构建块,并精确化了剩余未知。
What it achieved
将覆盖表示为类型,然后显式胶合
为什么有效
文字筛子编码冗余的匹配族值,并允许本应不可能的状态。
指数所需的拉回筛子需要超出 Haskell 实现可舒适表达的依赖类型。
类型化的覆盖和生成器保持有效的胶合接口小而无关表示被移除。
Sheafify 存储胶合语法,允许自由构造如余积和递归列表,无需提前运行操作。
将不动点作为显式未解决边界防止实现假装解决它尚未知道的问题。
可以借鉴什么
当形式定义产生非法状态和不可能的依赖类型时,将有效覆盖编码在类型中,仅暴露可执行的胶合操作。为组合保留自由构造。
后续
项目产出了一个演示仓库,包含具体和抽象的 Site/Sheaf 实例,并更清晰地界定了编码能表达和不能表达的范围。不动点仍未解决,但类型化覆盖方法使层操作在 Haskell 中可用,而无需引入全套筛子依赖机制。
从这里,追溯依据
参考来源
- Subcanonical coverage ncatlab.org
- Pursuing Shtuck inria.hal.science