# LANGUAGE FlexibleContexts      #
# LANGUAGE UndecidableInstances #

data Fix f a = Fix (f (Fix f a))

instance ( Functor f
           -- FIXME(sandy): Unfortunately, the recursion tactic fails to fire
           -- on this case. By explicitly adding the @Functor (Fix f)@
  dictionary , we can get Wingman to generate the right definition .
         , Functor (Fix f)
         ) => Functor (Fix f) where
  fmap fab (Fix f) = Fix (fmap (fmap fab) f)


 FIXME(sandy): Unfortunately, the recursion tactic fails to fire
 on this case. By explicitly adding the @Functor (Fix f)@
# LANGUAGE FlexibleContexts      #
# LANGUAGE UndecidableInstances #

data Fix f a = Fix (f (Fix f a))

instance ( Functor f
  dictionary , we can get Wingman to generate the right definition .
         , Functor (Fix f)
         ) => Functor (Fix f) where
  fmap fab (Fix f) = Fix (fmap (fmap fab) f)

