### Pattern matching

specify patterns that data should conform to
and if it does conform destructure or deconstruct the data

``````

In [ ]:

-- a trivial example of pattern matching

-- in haskell most everyting is an 'expression'

lucky :: (Integral a) => a -> String     -- this is the type annotation
lucky 7 = "LUCKY NUMBER SEVEN!"
lucky _ = "Sorry, you're out of luck!"

``````
``````

In [ ]:

lucky 6
lucky 7
lucky 42

``````
``````

In [ ]:

-- factorial function using recursion

fact :: (Integral a) => a -> a
fact 0 = 1  -- this is called the base case / a catch all stopper
fact n = n * fact (n - 1)  -- this is called "recursion" because fact refs itself in

``````
``````

In [ ]:

fact 3  --1. fact 3 reduces to 3 * fact (3-1) == fact 2
--2. fact 2 reduces to 2 * fact 1  -- fact (2-1) == fact 1
--3. fact 1 reduces to 1 * fact 0  -- fact 0 = 1 --first pattern
--4. together we end up with:
--   3 * (2 * (1 * 1)) = 6

``````
``````

In [ ]:

-- Patern matching with Tuples
addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)
addVectors (x1, y1) (x2, y2)= (x1 + x2, y1 + y2)

``````
``````

In [ ]:

``````
``````

In [ ]:

-- Pattern match in list comprehensions this way:

xs = [(1,3), (4,3), (5, 1)]
[a+b | (a,b) <- xs]

``````
``````

In [ ]:

[2,4,6]  == 2:4:6:[]   --[2,4,6] is syntactic sugar for 2:4:6:[]

``````
``````

In [ ]:

fact 10

``````