haskell - 在Agda中,递归

  显示原文与译文双语对照的内容

不用说,标准建设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? 它是否被做了什么? 发生哪些必需的?

时间: 原作者:

你会发现这种通过受限制的宇宙开发( functors ) 在 Ulf Norell是规范Agda教程

不幸的是并不是所有该被编码,因为所有通常的递归方案" destructiony " 那些消耗数据和所有" constructiony " 那些产生codata,说喂一个到其他的一定部分的概念。 你很可能在偏袒monad做这事但那是相当不满意。 大致就是什么categorists所做的,当他们说Haskell " true " 是CPO⊥虽然类别,因为其初始algebras和终端coalgebras不谋而合。

...