{-# OPTIONS_GHC -fno-warn-missing-methods #-} -- ^ option for exercise 6 -- Exercise 1 fib :: Integer -> Integer fib 0 = 0 fib 1 = 1 fib n = (fib (n-1)) + (fib (n-2)) fibs1 :: [Integer] fibs1 = map fib [0..] -- Exercise 2 fibs2 :: [Integer] fibs2 = map fst $ iterate (\l -> ( snd l , snd l + fst l )) (0,1) -- Exercise 3 data Stream a = Cons a (Stream a) streamToList :: Stream a -> [a] streamToList (Cons a s) = a : streamToList s instance Show a => Show (Stream a) where show s = show $ take 20 $ streamToList s -- Exercise 4 streamRepeat :: a -> Stream a streamRepeat e = Cons e (streamRepeat e) streamMap :: (a -> b) -> Stream a -> Stream b streamMap f (Cons a as) = Cons (f a) (streamMap f as) streamFromSeed :: (a -> a) -> a -> Stream a streamFromSeed f s = Cons s (streamFromSeed f (f s)) -- Exercise 5 nats :: Stream Integer nats = streamFromSeed (+1) 0 -- The number of times an integer can be evenly divided by 2. evenDiv2 :: Integer -> Integer evenDiv2 n = toInteger $ length $ takeWhile even $ iterate (`quot` 2) n ruler :: Stream Integer ruler = streamMap evenDiv2 $ streamFromSeed (+1) 1 -- Exercise 6 (Optional) x :: Stream Integer x = Cons 0 $ Cons 1 $ streamRepeat 0 instance Num (Stream Integer) where fromInteger n = Cons n $ streamRepeat 0 negate s = streamMap negate s (+) s1 s2 = streamMap (\p -> fst p + snd p) $ zip s1 s2 where zip (Cons a0 sa) (Cons b0 sb) = Cons (a0,b0) (zip sa sb) (*) (Cons a0 sa) b@(Cons b0 sb) = Cons (a0*b0) $ (streamMap (*a0) sb + (sa*b))