
Would it be possible to extend Coercible? I have also always wanted a coercible between the fixed point of the F-algebra and a recursive data type, e.g.: newtype Fix f = Fix (f (Fix f)) data List a = Nil | Cons a (List a) data ListF a f = NilF | ConsF a f deriving Functor type List' a = Fix (ListF a) I would like Coercible (List a) (Fix (ListF a)), then you don't have to manually write a conversion function when using a general catamorphism: cata :: (Functor f, Coercible a (Fix f)) => (f b -> b) -> (a -> b) I have already tried this with unsafeCoerce and that works, much to my surprise. It would be even nicer if GHC provided a built-in F-algebras, so that I wouldn't even need to define ListF manually. (I know that these F-algebras can be generated automatically with Template Haskell, but that is too heavyweight for most of my use cases) On 12/2/20 4:24 PM, Georgi Lyubenov wrote:
You can only coerce between types that guaranteedly have the same runtime representation (newtypes), and "structures of them". Look up Coercible for more information.
In this case, there is no way to know that two arbitrary types a and b have the same representation, so you can't coerce between them.
======= Georgi
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.