【问题标题】:Recursion Schemes in AgdaAgda 中的递归方案
【发布时间】:2013-01-19 21:30:11
【问题描述】:

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

【问题讨论】:

  • 在今年的 POPL 上,有一个关于在 Coq 中对数据类型进行编码的演示。他们为 Fix 构造描述了一个对 Coq 友好的替代方案,尽管我必须承认我还没有完全理解它。这是他们实现的链接:cs.utexas.edu/~bendy/MTC/index.php
  • 元理论点菜页面已移至people.csail.mit.edu/bendy/MTC

标签: haskell recursion agda catamorphism recursion-schemes


【解决方案1】:

您会在Ulf Norell's canonical Agda tutorial 中找到这样的发展(在有限的函子范围内)!

不幸的是,并非所有常见的递归方案都可以真正编码,因为所有“破坏性”方案都会消耗数据,而所有“构造性”方案都会产生 codata,因此将一个输入另一个的概念必然是部分的。您可能可以在偏心单子中完成所有操作,但这并不令人满意。当分类学家说 Haskell 的“真实范畴”是 CPO⊥ 时,这或多或少是这样做的,因为它的初始代数和终端代数重合。

【讨论】:

  • 谢谢——表征多项式函子是我认为你可以做到的。我很好奇是否有更通用的方法,但它看起来至少在民间传说中不存在。
  • 我认为一种更通用的方法需要一种方法来注释您的f : Set -> Set,说它在其论点中是严格肯定的。 Mini Agda 对此提供了支持,带有 f : ++Set -> Set 之类的注释。它还有许多其他花哨的注释可以让事情变得更有趣:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2011-10-19
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多