Functional Programming MT22, Common functions


Flashcards

Can you give the definition of cp (cartesian product) in Haskell (not as a fold)?

cp :: [[a]] -> [[a]]
cp [] = [[]]
cp (xs:xss) = [x:ys | x <- xs, ys <- cp xss]

Can you give the definition of subsets which returns all the subsets of a given list in Haskell (not a fold)?

subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]

Can you give the definition of subsetsN which returns all the subsets of a list with size exactly n in Haskell?

subsetsN :: Int -> [a] -> [[a]]
subsetsN 0 _ = [[]]
subsetsN _ [] = []
subsetsN n (x:xs) =
	[ x:ys | ys <- subsetsN (n-1) xs ]
	++ subsetsN n xs

Can you give the definition of filterDups which removes all duplicate elements from a list in Haskell?

filterDups :: Eq a => [a] -> [a]
filterDups xs = filterDups' xs []
    where filterDups' [] _ = []
          filterDups' (x:xs) seen
          | x `elem` seen = filterDups' xs seen
          | otherwise     = x:filterDups' xs (x:seen)

Can you give the definition of transpose which transposes a multidimensional list in Haskell?

transpose :: [[a]] -> [[a]]
transpose xss
	| all null xss = []
	| otherwise    = col xss : transpose (map tail xss)
	    where col = map head