在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教程,其中包含特定多项式仿函数类型的固定点;我想知道是否可以更普遍地定义它。特别是,我想定义类型的固定点,这些固定点可能在结构上相等,但在名义上是不等的。