view exercises/src/Exercise_2.hs @ 5:f1a337c9f260

week 2 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Sun, 28 Oct 2012 18:47:36 +0100
parents 243f6cfa029a
children 50f08a46ea10
line wrap: on
line source

module Exercise_2 where
import Test.QuickCheck
import Data.List

{---------------------------------------------------------------------}
{- Aufgabe G2.1 -}
all_sums :: [Integer] -> [Integer] -> [Integer]
all_sums xs ys = [x + y | x <- xs, y <- ys]


evens :: [Integer] -> [Integer]
evens xs = [x | x <- xs, even x]


n_lists :: [Integer] -> [[Integer]]
n_lists xs = [[1..x] | x <- xs]


all_even_sum_lists :: [Integer] -> [Integer] -> [[Integer]]
all_even_sum_lists xs ys = [[1..(x+y)] | x <- xs, y <- ys, even (x+y)]



{---------------------------------------------------------------------}
{- Aufgabe G2.2 -}
union'' :: [Integer] -> [Integer] -> [Integer]
union'' xs ys = xs ++ ys


intersection :: [Integer] -> [Integer] -> [Integer]
intersection xs ys = [x | x <- xs, x `elem` ys]
-- Alternativ ohne elem:
-- intersection xs ys = [x | x <- xs, y <- ys, x == y]


diff :: [Integer] -> [Integer] -> [Integer]
diff xs ys = [x | x <- xs, not(x `elem` ys)]


elem' :: Integer -> [Integer] -> Bool
elem' x xs = [y | y <- xs, y == x] /= [] 


union' :: [Integer] -> [Integer] -> [Integer]
union' xs ys = diff xs ys ++ ys



{---------------------------------------------------------------------}
{- Aufgabe G2.3 -}
eq_frac :: (Integer,Integer) -> (Integer,Integer) -> Bool
eq_frac (a,b) (c,d) = a * d == c * b


intersection_frac :: [(Integer,Integer)] -> [(Integer,Integer)] -> [(Integer,Integer)]
intersection_frac xs ys = [x | x <- xs, y <- ys, x `eq_frac` y]



{---------------------------------------------------------------------}
{- Aufgabe G2.4 -}
pow2_slow :: Integer -> Integer
pow2_slow 0 = 1
pow2_slow n | n > 0 = 2 * pow2_slow (n - 1)


pow2 :: Integer -> Integer
pow2 0 = 1
pow2 n
        | n < 0 = error "Postive n only"
        | even n = pow2 (n `div` 2) ^ 2
        | otherwise = 2 * pow2 (n - 1)



{---------------------------------------------------------------------}
{- Aufgabe G2.5 -}
reachable :: [(Integer, Integer)] -> Integer -> [(Integer, Integer)]
reachable graph 0 = nub $ concat [[(u, u), (v, v)] | (u, v) <- graph]
reachable graph 1 = graph
reachable graph n | n > 0 = [(u, x) | (u, v) <- graph, (w, x) <- reachable graph (n-1), v == w]



{---------------------------------------------------------------------}
{- Aufgabe H2.1 -}
factorials :: [Integer] -> [Integer]
factorials ns = undefined


count :: [Char] -> Char -> Integer
count cs c = undefined



{---------------------------------------------------------------------}
{- Aufgabe H2.2 -}
lookupTab :: [Integer] -> [(Integer, [Char])] -> [[[Char]]]
lookupTab keys tab = undefined



{---------------------------------------------------------------------}
{- Aufgabe H2.3 -}
wordsOfLength :: [Char] -> Integer -> [[Char]]
wordsOfLength alphabet n = undefined



{---------------------------------------------------------------------}
{- Aufgabe H2.4 -}
{-WETT-}
perms :: [Char] -> [[Char]]
perms [] = undefined
perms xs = undefined
{-TTEW-}