递归计划在阿格达(Recursion Schemes in Agda)

2019-08-16 18:38发布

不用说,在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 

是真棒,非常有用。

试图确定在阿格达了类似的事情(我把它只是为了完整性的缘故)

data Fix (f : Set -> Set) : Set where
    mkFix : f (Fix f) -> Fix f

失败,因为f不一定严格为正。 这是有道理的 - 我可以很容易地通过适当地选择得到这样的结构矛盾。

我的问题是:是否有在阿格达递归编码方案中的任何希望吗? 它是否已经完成? 要求是什么?

Answer 1:

你会发现这样的发展(超过仿函数的限制宇宙)的乌尔夫·诺雷尔的规范阿格达教程 !

不幸的是不是所有的通常的递归方案可以确实被编码,因为所有的“destructiony”个位消耗数据和所有的“constructiony”个位产生CODATA,所以供给一方转换成另一方的概念是一定部分。 你也许可以做到这一切在偏袒单子,但是这是相当令人不满意。 这是多了还是少了什么时,他们说,Haskell的“真实类别”是CPO⊥但是,因为其最初的代数和终端余代数一致的categorists在做什么。



文章来源: Recursion Schemes in Agda