> One particularly trivial example that comes to mind is: > > newtype Mu f = Mu (f (Mu f)) > > instance Show (f (Mu f)) => Show (Mu f) where > show (Mu x) = "Mu (" ++ show x ++ ")" > -- Or however you'd like to show it
Ehm, that does look like poor design. Sure you don't mean "Mu f can be printed if and only if f (Mu f) can be printed". What you probably mean is "if f transforms printable things to printable things, then Mu f is a printable thing". And you CAN express just that: type ShowD a = forall p. (forall x. Show x => p x) -> p a showD :: Show a => ShowD a showD px = px class ShowF f where showF :: Show a => ShowD (f a) instance Show a => Show (F a) where... -- here goes your "f" instance ShowF F where showF = showD -- and that is the only line of boilerplate instance ShowF f => Show (Mu f) where show (Mu fm) = "Mu (" ++ runShowHelper (showF (ShowHelper show)) fm ++ ")" newtype ShowHelper x = ShowHelper {runShowHelper :: x -> String} Sorry for possible bugs — I don't have ghc anywhere near me at the moment, but the idea is clear, I guess. Отправлено с iPhone _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe