不用说,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 中编码递归方案?已经完成了吗?需要什么?