【发布时间】:2013-01-19 21:30:11
【问题描述】:
不用说,Haskell 中的标准构造
newtype Fix f = Fix { getFix :: f (Fix f) }
cata :: (Functor f) => (f a -> a) -> Fix f -> a
cata f = f . fmap (cata f) . getFix
很棒而且非常有用。
尝试在 Agda 中定义一个类似的东西(为了完整起见,我将把它放出来)
data Fix (f : Set -> Set) : Set where
mkFix : f (Fix f) -> Fix f
失败是因为f 不一定是严格正数。这是有道理的——通过适当的选择,我可以很容易地从这个结构中得到一个矛盾。
我的问题是:有没有希望在 Agda 中编码递归方案?已经完成了吗?需要什么?
【问题讨论】:
-
在今年的 POPL 上,有一个关于在 Coq 中对数据类型进行编码的演示。他们为 Fix 构造描述了一个对 Coq 友好的替代方案,尽管我必须承认我还没有完全理解它。这是他们实现的链接:cs.utexas.edu/~bendy/MTC/index.php
-
元理论点菜页面已移至people.csail.mit.edu/bendy/MTC
标签: haskell recursion agda catamorphism recursion-schemes