我希望看到香蕉、镜头等的 Coq 版本。它们是在sumtypeofway 递归方案简介的优秀系列博客文章中建立的
然而,博客文章是在 Haskell 中的,它允许无限的非终止递归,因此完全满足于Y
组合器。哪个 Coq 不是。
特别是,定义取决于类型
newtype Term f = In { out :: f (Term f) }
它构建了无限类型 f (f (f (f ...)))
。 Term f
允许使用 Term 类型族对 catamorphisms、paramorphisms、anamorphisms 等进行非常漂亮和简洁的定义。
尝试将此移植到 Coq
Inductive Term f : Type := {out:f (Term f)}.
给了我预期的
Error: Non strictly positive occurrence of "Term" in "f (Term f) -> Term f".
问:在 Coq 中形式化上述 Haskell Term 类型的好方法是什么?
上面f
是 type Type->Type
,但也许它太笼统了,可能有一些方法可以限制我们使用归纳类型,使得每个应用程序 都f
在减少?
也许有人已经在 Coq 中实现了Banans、Lenses、Envelopes的递归方案?