Agda的递归方案

时间:2013-02-05 02:43:42

标签: haskell recursion agda catamorphism recursion-schemes

毋庸置疑,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编码递归方案有什么希望吗?它完成了吗?需要什么?

1 个答案:

答案 0 :(得分:16)

你会在Ulf Norell's canonical Agda tutorial中找到这样一个开发(在一个受限制的仿函数范围内)!

不幸的是,并非所有通常的递归方案都可以真正编码,因为所有“破坏性”的递归方案都会消耗数据,而所有“建构”的方法都会产生密码数据,因此将一个进给到另一个的概念必然是部分的。你可以在偏好monad中完成所有这一切,但这并不令人满意。当他们说Haskell的“真正的类别”是CPO时,这或多或少是分类者正在做的事情,因为它的最初代数和终端余代数是重合的。