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