data ListItem a = Single a | Multiple a Int deriving (Show) encode :: Eq a => [a] -> [(a,Int)] encode = foldr encodeHelper [] where encodeHelper a p@((x,c):ps) | x==a = (a,c+1):ps encodeHelper a p = (a,1):p encodeDirect :: Eq a => [a] -> [ListItem a] encodeDirect = map encodeHelper . encode where encodeHelper (a,c) | c>1 = Multiple a c | otherwise = Single a