如何定义仿函数修复点?

时间:2017-03-29 02:18:25

标签: functor agda

在Haskell中,我可以定义一个endofunctor fixpoint:

data Fix f = Fix (f (Fix f))

但是在阿格达不能:

data Fix (F : Id (Set → Set)) : Set where
    fix : (unId F) (Fix F) → Fix F

正如它所说"修复不是严格肯定的,因为它发生在修复定义中构造函数修复类型中的绑定变量的参数中。"

我尝试使用stdlib中的Coinduction.∞,徒劳无功:

data Fix (F : Set → Set) : Set where
    fix : ∞ (F (Fix F)) → Fix F

data Fix (F : Set → Set) : Set where
    fix : F (∞ (Fix F)) → Fix F

既不起作用。

我发现this doc定义了多项式仿函数Functor和一个有效的函数[_] : Functor → Set → Set

data Functor : Set₁ where
    Id : Functor
    Const : Set → Functor
    _⊕_ : Functor → Functor → Functor
    _⊗_ : Functor → Functor → Functor

[_] : Functor → Set → Set
[ Id ] B = B
[ Const C ] _ = C
[ F ⊕ G ] B = [ F ] B ⊎ [ G ] B
[ F ⊗ G ] B = [ F ] B × [ G ] B

data Fix (F : Functor) : Set where
    fix : [ F ] (Fix F) → Fix F

但我不确定为什么会这样,而且不会,因为两者都有Fix作为绑定变量F的参数。

可以在Agda中定义一般的endofunctor修复点吗?若然,怎么做?

编辑:这被标记为14699334的可能重复,但唯一的答案是链接到(?)Agda教程,其中包含特定多项式仿函数类型的固定点;我想知道是否可以更普遍地定义它。特别是,我想定义类型的固定点,这些固定点可能在结构上相等,但在名义上是不等的。

0 个答案:

没有答案