module Main where class Show a => Foo a where op :: a -> a newtype Moose = MkMoose () deriving (Show, Eq, Ord) newtype Noose = MkNoose () deriving (Ord) instance Eq Noose where a == b = False -- Non-standard! f :: Ord a => a -> Bool f x = x==x main = do print (MkNoose () == MkNoose ()) -- Eq Noose print (f (MkNoose ())) -- via Ord Noose print (MkMoose () == MkMoose ()) -- Eq Moose print (f (MkMoose ())) -- via Ord Moose putStrLn (show (MkMoose ())) -- Should not use the show () method