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
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell