言うまでもなく、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 で再帰スキームをエンコードする希望はありますか? それは行われましたか?何が必要ですか?