data Stream a = Cons a (Stream a) chop :: Int -> Stream a -> [a] chop 0 _ = [] chop n (Cons x s) = x : chop (n-1) s decode :: Stream (a, Int) -> Stream a decode (Cons (x, 0) s) = decode s decode (Cons (x, n) s) = Cons x $ decode $ Cons (x, n-1) s encode :: Eq a => Stream a -> Stream (a, Int) encode (Cons x s) = accumulate x 1 s where accumulate :: Eq a => a -> Int -> Stream a -> Stream (a, Int) accumulate x n (Cons y s) | x == y = accumulate x (n+1) s | otherwise = Cons (x,n) (accumulate y 1 s)