Jim Apple wrote:
data Rec f = In (f (Rec f)) type P f a = f (Rec f, a)
mapP :: Functor f => (a -> b) -> P f a -> P f b mapP g = fmap (\(x,a) -> (x, g a))
instance Functor f => Functor (P f) where fmap = mapP
Why did Gofer have this power while Haskell does not?
Haskell does have the same power as Gofer, it simply does not allow you to define instances for type synonyms (just in order to prevent overlapping instances, I guess). If you use a newtype instead of a type synonym everything works fine: data Rec f = In (f (Rec f)) newtype P f a = P (f (Rec f, a)) unP (P x) = x mapP :: Functor f => (a -> b) -> P f a -> P f b mapP g = P . fmap (\((x,a)) -> (x, g a)) . unP instance Functor f => Functor (P f) where fmap = mapP Wolfgang