{-# LANGUAGE OverloadedStrings #-} import Data.String (IsString( .. )) data Foo = Bar | Baz deriving (Eq, Show) instance Num Foo where _ + _ = Bar _ * _ = Baz abs _ = Bar signum _ = Baz fromInteger 0 = Bar fromInteger 1 = Baz fromInteger _ = Bar negate Bar = Baz negate Baz = Bar instance IsString Foo where fromString "bar" = Bar x :: Foo x = 0 y :: Foo y = 1 z :: Foo z = "bar" example :: Foo -> Bool example 0 = True example _ = False example2 :: Foo -> Bool example2 "bar" = True example2 _ = False main :: IO () main = do print x -- Bar print y -- Baz print $ example Bar -- True print z -- Bar print $ example Baz -- False