Needless to say, the standard construction in 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
is awesome and extremely useful.
Trying to define a similar thing in Agda (I'll put it just for completeness sake)
data Fix (f : Set -> Set) : Set where
mkFix : f (Fix f) -> Fix f
fails because f
is not necessarily strictly positive. This makes sense -- I could easily get a contradiction from this construction by picking appropriately.
My question is: is there any hope of encoding recursion schemes in Agda? Has it been done? What would be required?
You'll find such a development (over a restricted universe of functors) in Ulf Norell's canonical Agda tutorial!
Unfortunately not all the usual recursion schemes can really be encoded because all the "destructiony" ones consume data and all the "constructiony" ones produce codata, so the notion of feeding one into the other is necessarily partial. You could probably do it all in the partiality monad but that's rather unsatisfactory. That is more or less what the categorists are doing when they say that Haskell's "true category" is CPO⊥ though, because its initial algebras and terminal coalgebras coincide.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With