[英]Recursion Schemes in 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編碼遞歸方案有什么希望嗎? 它完成了嗎? 需要什么?
你會在Ulf Norell的規范Agda教程中找到這樣一個開發(在一個有限的仿函數范圍內)!
遺憾的是,並非所有通常的遞歸方案都可以真正編碼,因為所有“破壞性”的遞歸方案都會消耗數據,而所有“建構”的方法都會產生密碼數據,因此將一個進給到另一個的概念必然是部分的。 你可以在偏好monad中完成所有這一切,但這並不令人滿意。 當他們說Haskell的“真正的類別”是CPO⊥時,這或多或少是分類者正在做的事情,因為它的最初代數和終端余代數是重合的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.