{-# 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)) instance Fractional (Stream Integer) where (/) a@(Cons a0 sa) b@(Cons b0 sb) = Cons (a0 `div` b0) $ streamMap (`div` b0) (sa-(a/b)*sb) fibs3 :: Stream Integer fibs3 = x / (1 - x - (x*x)) -- Exercise 7 (Optional) data Matrix = M Integer Integer Integer Integer instance Num Matrix where (*) (M a11 a12 a21 a22) (M b11 b12 b21 b22) = M (a11*b11+a12*b21) (a11*b12+a12*b22) (a21*b11+a22*b21) (a21*b12+a22*b22) fib4 :: Integer -> Integer fib4 0 = 0 fib4 n = take12 ((M 1 1 1 0)^n) where take12 (M a11 a12 a21 a22) = a12 fibs4 :: Stream Integer fibs4 = streamMap fib4 $ streamFromSeed (+1) 0