### Expression

Show types   |   Show history

### Definitions

and (True:xs) = and xs and (False:xs) = False and [] = True or (False:xs) = or xs or (True:xs) = True or [] = False all p = and . map p any p = or . map p head (x:xs) = x tail (x:xs) = xs take 0 xs = [] take n (x:xs) = x : take (n - 1) xs drop 0 xs = xs drop n (x:xs) = drop (n - 1) xs elem e [] = False elem e (x:xs) = if e == x then True else elem e xs max a b = if a >= b then a else b min a b = if a <= b then a else b maximum (x:xs) = foldl max x xs minimum (x:xs) = foldl min x xs length [] = 0 length (x:xs) = 1 + length xs zip (x:xs) (y:ys) = (x, y) : zip xs ys zip [] _ = [] zip _ [] = [] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys zipWith _ [] _ = [] zipWith _ _ [] = [] unzip [] = ([], []) unzip ((a, b):xs) = (\(as, bs) -> (a:as, b:bs)) \$ unzip xs fst (x,_) = x snd (_,y) = y curry f a b = f (a, b) uncurry f (a, b) = f a b repeat x = x : repeat x replicate 0 _ = [] replicate n x = x : replicate (n - 1) x enumFromTo a b = if a <= b then a : enumFromTo (a + 1) b else [] sum (x:xs) = x + sum xs sum [] = 0 product (x:xs) = x * product xs product [] = 1 reverse [] = [] reverse (x:xs) = reverse xs ++ [x] concat = foldr (++) [] map f [] = [] map f (x:xs) = f x : map f xs not True = False not False = True filter p (x:xs) = if p x then x : filter p xs else filter p xs filter p [] = [] foldr f ini [] = ini foldr f ini (x:xs) = f x (foldr f ini xs) foldl f acc [] = acc foldl f acc (x:xs) = foldl f (f acc x) xs scanl f b [] = [b] scanl f b (x:xs) = b : scanl f (f b x) xs iterate f x = x : iterate f (f x) id x = x const x _ = x flip f x y = f y x even n = (n `mod` 2) == 0 odd n = (n `mod` 2) == 1 fix f = f (fix f)