
On Fri, Jun 11, 2010 at 08:12:43PM -0500, Antoine Latter wrote:
1) Which extensions are required to make the code compile.
OverlappingInstances (of course), and IncoherrentInstances, since neither instance is more specific than the other.
Well, I guess it can't be compiled at all :( $ ghci -XGADTs -XOverlappingInstances -XIncoherentInstances -XFlexibleInstances -XUndecidableInstances GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Prelude> :l T [1 of 1] Compiling Main ( T.lhs, interpreted ) T.lhs:4:12: Duplicate instance declarations: instance [incoherent] (Show a) => MaybeShow a -- Defined at T.lhs:4:12-32 instance [incoherent] MaybeShow a -- Defined at T.lhs:7:12-22
2) After compiled, if it works as intended or not.
It's hard for me to concieve of a situation where something requiring IncoherrentInstances is work as intended, but maybe that's a failure of imagtination.
Perhaps we should omit the "Nothing" instance: class MaybeShow a where maybeShow :: a -> Maybe String instance Show a => MaybeShow a where maybeShow = Just . show Instances for any non-Show-able data types should be manually written, such as: instance MaybeShow (a -> b) where maybeShow = const Nothing I think this solution still requires OverlappingInstances and UndecidableInstances. Finally we could omit the "Show a => MaybeShow a" definition as well and just manually write everything: class MaybeShow a where may_I_show_you :: a -> Maybe String yes_please :: Show a => a -> Maybe String yes_please = Just . show no_thanks :: a -> Maybe String no_thanks = const Nothing instance MaybeShow () where may_I_show_you = yes_please instance MaybeShow Char where may_I_show_you = yes_please instance MaybeShow Int where may_I_show_you = yes_please instance MaybeShow (a -> b) where may_I_show_you = no_thanks instance MaybeShow (IO a) where may_I_show_you = no_thanks ... -- Felipe.