Download Haskell - Electrical Engineering & Computer Science at CSM

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Haskell
Chapter 4
Recursion

Like other languages



Base case
Recursive call
Author programs a number of built-in functions as
examples
Maximum
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "can't take maximum of empty list“
-- base case, if only one item, return it
maximum' [x] = x
-- else return max of first element or recursive call
maximum' (x:xs) = max x (maximum' xs)
Replicate
replicate' :: Int -> a -> [a]
replicate' n x
-- base case returns empty list
| n <= 0 = []
-- else cons element to result of recursive call
| otherwise = x : replicate' (n-1) x
 Used guards because boolean condition, not a pattern
 replicate' 3 5

5 : replicate’ 2 5 => [5,5,5]

5 : replicate’ 1 5 => [5, 5]

5: replicate’ 0 5 => [5]

n == 0, => []
Take
Two base cases (n=0, or empty list)
 Guard without otherwise will fall through to patterns
take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
| n <= 0 = []
take' _ [] = []
take' n (x:xs) = x : take' (n-1) xs

Reverse
Note ++ rather than : because both are lists
 : works at front of list, not back
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]

Repeat
Haskell supports infinite lists
repeat' :: a -> [a]
repeat' x = x:repeat' x
 repeat 3


3: repeat 3

3: repeat 3

etc,
Think it through





Prelude> zip [1,2,3] [4,5,6]
[(1,4),(2,5),(3,6)]
How would you write zip?
How many base cases?
Patterns or guards?
Zip
zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys
Quick Exercise

With a partner, trace this code with this list of numbers:

[5,2,6,7,1,3,9,4]
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let
smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] ++ quicksort larger
Turn in for class participation credit
Play and Share?

No, let’s start on the homework.
Related documents