{- typeclasses.hs This file contains some of the examples on typeclasses to be shown in the second class of the course "Haskell for Life", by Sergiu Ivanov (sivanov@lacl.fr): http://lacl.fr/~sivanov/doku.php?id=en:haskell_for_life This file is distributed under the Creative Commons Attribution Alone licence.-} -- | A simple redefinition of the 'Eq' typeclass. class BasicEq a where isEqual :: a -> a -> Bool isElement :: BasicEq a => a -> [a] -> Bool isElement _ [] = False isElement y (x:xs) | isEqual y x = True | otherwise = isElement y xs instance BasicEq Bool where isEqual True True = True isEqual False False = True isEqual _ _ = False instance BasicEq a => BasicEq [a] where isEqual [] [] = True isEqual _ [] = False isEqual [] _ = False isEqual (x:xs) (y:ys) | isEqual x y = isEqual xs ys | otherwise = False -- | This typeclasses are simpler than 'Show' and 'Read', but -- essentially capture their principal function. class SimplifiedShow a where show :: a -> String class SimplifiedRead a where read :: String -> a