You can read about these subjects in Learn You a Haskell, chapters 6 and 8.
Here are some types and type classes that we defined in the lecture.
import Data.List -- A fraction type for rational numbers. data Frac = Frac Int Int instance Eq Frac where (==) (Frac a b) (Frac c d) = a * d == b * c instance Show Frac where show (Frac a b) = show a ++ "/" ++ show b instance Ord Frac where Frac a b <= Frac c d = a * d <= b * c -- A generalized fraction type where the numerator and denominator -- can be of any integral type. data GFrac t = GFrac t t instance (Integral t) => Eq (GFrac t) where (==) (GFrac a b) (GFrac c d) = a * d == b * c -- A type class for a set of integers. class IntSet s where empty :: s contains :: Int -> s -> Bool add :: Int -> s -> s remove :: Int -> s -> s -- A list of integers is an IntSet. instance IntSet [Int] where empty = [] contains = elem add = (:) remove = delete -- A tree of integers is an IntSet. data IntTree = Nil | Node IntTree Int IntTree deriving (Show) instance IntSet IntTree where empty = Nil contains x Nil = False contains x (Node left y right) = case compare x y of EQ -> True LT -> contains x left GT -> contains y right add x Nil = Node Nil x Nil add x tree@(Node left y right) = case compare x y of EQ -> tree LT -> Node (add x left) y right GT -> Node left y (add x right) remove x tree = … -- A type class for a set of values of any type. class Set s where empty :: s a contains :: Ord a => a -> s a -> Bool add :: Ord a => a -> s a -> s a remove :: Ord a => a -> s a -> s a -- A list is a Set. instance Set [] where empty = [] contains = elem add = (:) remove = delete -- A tree is a Set. data Tree a = Nil | Node (Tree a) a (Tree a) deriving (Show) instance Set Tree where empty = Nil contains x tree = … add x tree = … remove x tree = …