haskell tour (part 2)

137
Haskell A Whirlwind Tour (Part II) William Taysom ~ 2011

Upload: william-taysom

Post on 29-Aug-2014

2.417 views

Category:

Technology


3 download

DESCRIPTION

We continue our introduction to Haskell. Today we talk about parametric types and list comprehensions.

TRANSCRIPT

Page 1: Haskell Tour (Part 2)

HaskellA Whirlwind Tour

(Part II)William Taysom ~ 2011

Page 2: Haskell Tour (Part 2)
Page 3: Haskell Tour (Part 2)

Haskell is a non-strict, purely functional programming language with strong,static type inference.

Page 4: Haskell Tour (Part 2)

Review

Page 5: Haskell Tour (Part 2)

Recursive Data

data Color = Red | Green | Blue | Mix Color Color

Page 6: Haskell Tour (Part 2)

Recursive Functions

hue :: Color -> Doublehue Red = 0hue Green = 120hue Blue = 240

Page 7: Haskell Tour (Part 2)

hue (Mix c c') = let h = hue c h' = hue c' m = average h h' m' = norm (m + 180) d = distance h m in case compare d 90 of LT -> m EQ -> nan GT -> m'

norm h | h < 360 = h | otherwise = norm (h - 360)

h = 300

h' = 60

m = 180

m' = 0

Page 8: Haskell Tour (Part 2)

ParametricTypes

Page 9: Haskell Tour (Part 2)

Tuple (Product)

data Point = Point Double Double

Page 10: Haskell Tour (Part 2)

Tuple (Product)

data Pair a b = Pair a b

Page 11: Haskell Tour (Part 2)

Tuple (Product)

data (a, b) = (a, b)-- Built-in syntax:-- definition only for illustrative purposes.

Page 12: Haskell Tour (Part 2)

Tuple (Product)

data (a, b) = (a, b)-- Built-in syntax:-- definition only for illustrative purposes.

ghci> (Blue, False)

Page 13: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci>

Page 14: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False

Page 15: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci>

Page 16: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t it

Page 17: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci>

Page 18: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)

Page 19: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)(,) :: a -> b -> (a, b)ghci>

Page 20: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)(,) :: a -> b -> (a, b)ghci> :kind (,)

Page 21: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)(,) :: a -> b -> (a, b)ghci> :kind (,)(,) :: * -> * -> *ghci>

Page 22: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)(,) :: a -> b -> (a, b)ghci> :kind (,)(,) :: * -> * -> *ghci> :k Color

Page 23: Haskell Tour (Part 2)

ghci> (Blue, False)(Blue,False)ghci> (,) Blue False(Blue,False)ghci> :t itit :: (Color, Bool)ghci> :t (,)(,) :: a -> b -> (a, b)ghci> :kind (,)(,) :: * -> * -> *ghci> :k ColorColor :: *ghci>

Page 24: Haskell Tour (Part 2)

Color :: *ghci>

Page 25: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)

Page 26: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci>

Page 27: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)

Page 28: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci>

Page 29: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)

Page 30: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)(,,,) :: a -> b -> c -> d -> (a, b, c, d)ghci>

Page 31: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)(,,,) :: a -> b -> c -> d -> (a, b, c, d)ghci> :t ()

Page 32: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)(,,,) :: a -> b -> c -> d -> (a, b, c, d)ghci> :t ()() :: ()ghci>

Page 33: Haskell Tour (Part 2)

Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)(,,,) :: a -> b -> c -> d -> (a, b, c, d)ghci> :t ()() :: ()ghci> -- Trivial is similar to void.

Page 34: Haskell Tour (Part 2)

data Either a b = Left a | Right b

Either (Sum)Color :: *ghci> :t (Red, Blue, Green)(Red, Blue, Green) :: (Color, Color, Color)ghci> :t (,,)(,,) :: a -> b -> c -> (a, b, c)ghci> :t (,,,)(,,,) :: a -> b -> c -> d -> (a, b, c, d)ghci> :t ()() :: ()ghci> -- Trivial is similar to void.ghci>

Page 35: Haskell Tour (Part 2)

data Either a b = Left a | Right b

Either (Sum)

Page 36: Haskell Tour (Part 2)

data Maybe a = Nothing | Just a

Maybe (Optional)

Page 37: Haskell Tour (Part 2)

hue :: Color -> Doublehue Red = 0hue Green = 120hue Blue = 240

hue (Mix c c') = ... sometimes NaN

Page 38: Haskell Tour (Part 2)

hue :: Color -> Doublehue Red = 0hue Green = 120hue Blue = 240

hue (Mix c c') = ... sometimes nothing

Page 39: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = 0hue Green = 120hue Blue = 240

hue (Mix c c') = ... sometimes nothing

Page 40: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = Just 0hue Green = Just 120hue Blue = Just 240

hue (Mix c c') = ... sometimes nothing

Page 41: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = Just 0hue Green = Just 120hue Blue = Just 240

hue (Mix c c') = let ... stuff ... in case compare d 90 of LT -> m EQ -> nan GT -> m'

Page 42: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = Just 0hue Green = Just 120hue Blue = Just 240

hue (Mix c c') = let ... stuff ... in case compare d 90 of LT -> Just m EQ -> nan GT -> Just m'

Page 43: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = Just 0hue Green = Just 120hue Blue = Just 240

hue (Mix c c') = let ... stuff ... in case compare d 90 of LT -> Just m EQ -> Nothing GT -> Just m'

Page 44: Haskell Tour (Part 2)

hue :: Color -> Maybe Doublehue Red = Just 0hue Green = Just 120hue Blue = Just 240

hue (Mix c c') = let h = hue c h' = hue c' ... stuff ... in case compare d 90 of LT -> Just m EQ -> Nothing GT -> Just m'

Page 45: Haskell Tour (Part 2)

hue (Mix c c') = let h = hue c h' = hue c' ...

Page 46: Haskell Tour (Part 2)

hue (Mix c c') = let h = hue c h' = hue c' ...

Page 47: Haskell Tour (Part 2)

hue (Mix c c') = let (h, h') = (hue c, hue c') ...

Page 48: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (h, h') -> let ...

Page 49: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (Just h, Just h') -> let ...

Page 50: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (Just h, Just h') -> let ... (Just h, Nothing) -> ... (Nothing, Just h') -> ... (Nothing, Nothing) -> ...

Page 51: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (Just h, Just h') -> let ... (Just h, Nothing) -> Nothing (Nothing, Just h') -> Nothing (Nothing, Nothing) -> Nothing

Page 52: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (Just h, Just h') -> let ... _ -> Nothing

Page 53: Haskell Tour (Part 2)

hue (Mix c c') = case (hue c, hue c') of (Just h, Just h') -> let m = average h h' m' = norm (m + 180) d = distance h m in case compare d 90 of LT -> Just m EQ -> Nothing GT -> Just m' _ -> Nothing

Page 54: Haskell Tour (Part 2)

Parametric Polymorphism

id x = x

const x _ = x

flip f x y = f y x

Page 55: Haskell Tour (Part 2)

Parametric Polymorphismid :: a -> aid x = x

const x _ = x

flip f x y = f y x

Page 56: Haskell Tour (Part 2)

Parametric Polymorphismid :: a -> aid x = x

const :: a -> b -> aconst x _ = x

flip f x y = f y x

Page 57: Haskell Tour (Part 2)

Parametric Polymorphismid :: a -> aid x = x

const :: a -> b -> aconst x _ = x

flip :: (a -> b -> c) -> b -> a -> cflip f x y = f y x

Page 58: Haskell Tour (Part 2)

Parametric Polymorphism

infixr . -- defaults to 9(f . g) x = f (g x)

Page 59: Haskell Tour (Part 2)

Parametric Polymorphism(.) :: (b -> c) -> (a -> b) -> a -> cinfixr . -- defaults to 9(f . g) x = f (g x)

Page 60: Haskell Tour (Part 2)

Parametric Polymorphism(.) :: (b -> c) -> (a -> b) -> a -> cinfixr . -- defaults to 9(f . g) x = f (g x)

isN :: Double -> BoolisN = not . isNaN

Page 61: Haskell Tour (Part 2)

Parametric Polymorphism(.) :: (b -> c) -> (a -> b) -> a -> cinfixr . -- defaults to 9(f . g) x = f (g x)

isN :: Double -> BoolisN = not . isNaN

celsiusToFahrenheit :: Double -> DoublecelsiusToFahrenheit t = 9/5 * t + 32

Page 62: Haskell Tour (Part 2)

Parametric Polymorphism(.) :: (b -> c) -> (a -> b) -> a -> cinfixr . -- defaults to 9(f . g) x = f (g x)

isN :: Double -> BoolisN = not . isNaN

celsiusToFahrenheit :: Double -> DoublecelsiusToFahrenheit t = 9/5 * t + 32celsiusToFahrenheit' = (32 +) . (9/5 *)

Page 63: Haskell Tour (Part 2)

Parametric Polymorphism

infixr 0 $ -- very low precedence.f $ x = f x

Page 64: Haskell Tour (Part 2)

Parametric Polymorphism($) :: (a -> b) -> a -> binfixr 0 $ -- very low precedence.f $ x = f x

Page 65: Haskell Tour (Part 2)

Parametric Polymorphism($) :: (a -> b) -> a -> binfixr 0 $ -- very low precedence.f $ x = f x

-- Allows you to drop parenthesis:n = sqrt ( abs ( cos 1))n' = sqrt $ abs $ cos 1

Page 66: Haskell Tour (Part 2)

data List a = Nil | Cons a (List a)

List (Stream)

Page 67: Haskell Tour (Part 2)

List (Stream)

data [a] = [] | a:[a]-- Built-in syntax:-- definition only for illustrative purposes.

Page 68: Haskell Tour (Part 2)

List (Stream)

data [a] = [] | a:[a]-- Built-in syntax:-- definition only for illustrative purposes.

ghci> [1,2,3]

Page 69: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci>

Page 70: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3]

Page 71: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci>

Page 72: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[]

Page 73: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[][1,2,3]ghci>

Page 74: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[][1,2,3]ghci> :t (:)

Page 75: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[][1,2,3]ghci> :t (:)(:) :: a -> [a] -> [a]ghci>

Page 76: Haskell Tour (Part 2)

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[][1,2,3]ghci> :t (:)(:) :: a -> [a] -> [a]ghci> :t []

Page 77: Haskell Tour (Part 2)

Characters

c = 'c'six = '6'tab = '\t'

isSpace, isAlpha, isDigit :: Char -> Boolord :: Char -> Intchr :: Int -> Char

ghci> [1,2,3][1,2,3]ghci> 1:[2,3][1,2,3]ghci> 1:2:3:[][1,2,3]ghci> :t (:)(:) :: a -> [a] -> [a]ghci> :t [][] :: [a]ghci>

Page 78: Haskell Tour (Part 2)

Characters

c = 'c'six = '6'tab = '\t'

isSpace, isAlpha, isDigit :: Char -> Boolord :: Char -> Intchr :: Int -> Char

Page 79: Haskell Tour (Part 2)

Strings (Type Synonym)

type String = [Char]

Page 80: Haskell Tour (Part 2)

Strings (Type Synonym)

type String = [Char]

ghci> :info String

Page 81: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci>

Page 82: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']

Page 83: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']"hello"ghci>

Page 84: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']"hello"ghci> :t error

Page 85: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']"hello"ghci> :t errorerror :: [Char] -> aghci>

Page 86: Haskell Tour (Part 2)

ghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']"hello"ghci> :t errorerror :: [Char] -> aghci> error "oops"

Page 87: Haskell Tour (Part 2)

one_ten = [1..10]a_z = ['a'..'z']

Arithmetic Sequencesghci> :info Stringtype String = [Char] !-- Defined in GHC.Baseghci> ['h', 'e', 'l', 'l', 'o']"hello"ghci> :t errorerror :: [Char] -> aghci> error "oops"*** Exception: oopsghci>

Page 88: Haskell Tour (Part 2)

one_ten = [1..10]a_z = ['a'..'z']

Arithmetic Sequences

Page 89: Haskell Tour (Part 2)

nats = [1..]

Arithmetic Sequences

Page 90: Haskell Tour (Part 2)

Length

length :: [a] -> Intlength [] = 0length (_:xs) = 1 + length xs

length one_ten --> 10length a_z --> 26

Page 91: Haskell Tour (Part 2)

Map

map :: (a -> b) -> [a] -> [b]map f [] = []map f (x:xs) = f x : map f xs

map ord "abc" --> [97, 98, 99]

Page 92: Haskell Tour (Part 2)

Append

(++) :: [a] -> [a] -> [a]infixr 5 ++[] ++ ys = ys(x:xs) ++ ys = x : (xs ++ ys)

"hello" ++ " " ++ "world" --> "hello world"

Page 93: Haskell Tour (Part 2)

Filter

filter :: (a -> Bool) -> [a] -> [a]filter p [] = []filter p (x:xs) | p x = x : filter p xs | otherwise = filter p xs

filter (> 7) one_ten --> [8, 9, 10]

Page 94: Haskell Tour (Part 2)

Fold

foldr :: (a -> b -> b) -> b -> [a] -> bfoldr f z [] = zfoldr f z (x:xs) = f x (foldr f x xs)

foldr (*) 1 [1..5] --> 120

Page 95: Haskell Tour (Part 2)

Concat (Flattening)

concat :: [[a]] -> [a]concat = foldr (++) []

concat ["hello", ", ", "world"] --> "hello, world"

Page 96: Haskell Tour (Part 2)

ListComprehensions

Page 97: Haskell Tour (Part 2)

List Comprehensions

divides x y = rem y x == 0

divisors x = [d | d <- [1..x], d `divides` x]

Page 98: Haskell Tour (Part 2)

Generators

[ (a, a, a) | a <- nats]

[(1,1,1),(2,2,2),(3,3,3),⋯]

Page 99: Haskell Tour (Part 2)

Generators

[ (a, b, c) | a <- nats, b <- nats, c <- nats]

[(1,1,1),(1,1,2),(1,1,3),⋯]

Page 100: Haskell Tour (Part 2)

Generators

[ (a, b, c) | a <- nats, b <- nats, c <- nats]

[(1,1,1),(1,1,2),(1,1,3),⋯]

(1,2,3) (1,3,2)(2,1,3) (3,1,2)(2,3,1) (3,2,1)

Page 101: Haskell Tour (Part 2)

Generators

[ (a, b, c) | a <- nats, b <- [1..a], c <- [1..b]]

[(1,1,1),(2,1,1),(2,2,1),⋯]

Page 102: Haskell Tour (Part 2)

Generators

[ (a, b, c) | c <- nats, b <- [1..c], a <- [1..b]]

[(1,1,1),(1,1,2),(1,2,2),⋯]

Page 103: Haskell Tour (Part 2)

Guards

[ (a, b, c) | c <- nats, b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]

[(3,4,5),(6,8,10),(5,12,13),⋯]

Page 104: Haskell Tour (Part 2)

Local Declaration

[ (a, b, c) | c <- nats, b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, ... commonDivisors == [1]]

[(3,4,5),(5,12,13),(8,15,17),⋯]

Page 105: Haskell Tour (Part 2)

Local Declaration

[ (a, b, c) | c <- nats, b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, let commonDivisors = [d | d <- divisors a, d `divides` b, d `divides` c], commonDivisors == [1]]

[(3,4,5),(5,12,13),(8,15,17),⋯]

Page 106: Haskell Tour (Part 2)

Local Declaration

[ (a, b, c) | c <- nats, b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, let d = gcd a b, d == 1]

[(3,4,5),(5,12,13),(8,15,17),⋯]

Page 107: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

Page 108: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

primes

Page 109: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

sieve [2..]

Page 110: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

sieve (2:[3..])

Page 111: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : sieve [x | x <- [3..], rem x 2 /= 0]

Page 112: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : sieve [x | x <- 3:[4..], rem x 2 /= 0]

Page 113: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : sieve (3:[x | x <- [4..], rem x 2 /= 0])

Page 114: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve [x | x <- [x | x <- [4..], rem x 2 /= 0], rem x 3 /= 0]

Page 115: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve [x | x <- [x | x <- 4:[5..], rem x 2 /= 0], rem x 3 /= 0]

Page 116: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve [x | x <- [x | x <- [5..], rem x 2 /= 0], rem x 3 /= 0]

Page 117: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve [x | x <- [x | x <- 5:[6..], rem x 2 /= 0], rem x 3 /= 0]

Page 118: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve [x | x <- 5:[x | x <- [6..], rem x 2 /= 0], rem x 3 /= 0]

Page 119: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : sieve (5:[x | x <- [x | x <- [6..], rem x 2 /= 0], rem x 3 /= 0])

Page 120: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- [x | x <- [x | x <- [6..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 121: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- [x | x <- [x | x <- 6:[7..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 122: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- [x | x <- [x | x <- [7..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 123: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- [x | x <- [x | x <- 7:[8..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 124: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- [x | x <- 7:[x | x <- [8..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 125: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve [x | x <- 7:[x | x <- [x | x <- [8..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0]

Page 126: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : sieve (7:[x | x <- [x | x <- [x | x <- [8..], rem x 2 /= 0], rem x 3 /= 0]), rem x 5 /= 0])

Page 127: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

2 : 3 : 5 : 7 : sieve ⋯

Page 128: Haskell Tour (Part 2)

Recursion

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

[2, 3, 5, 7, sieve ⋯]

Page 129: Haskell Tour (Part 2)

To be continued...

Page 130: Haskell Tour (Part 2)

Summary

Haskell has parametric types.

List Comprehensions are cool.

Page 131: Haskell Tour (Part 2)

Preview: Infinite Lists

primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, rem x p /= 0]

Page 132: Haskell Tour (Part 2)

Preview: IO (echo.hs)

import System.Environment (getArgs)import Data.List (intercalate)

main = do args <- getArgs putStrLn (intercalate " " args)

Page 133: Haskell Tour (Part 2)

Preview: Parsers

Page 134: Haskell Tour (Part 2)

Preview: Parse JSON

data Value = String String | Number Double | Object [(String, Value)] | Array [Value] | Bool Bool | Null

Page 135: Haskell Tour (Part 2)

Preview: Parse JSON

value = String <$> jsstring <|> Number <$> number <|> Object <$> commaGroup '{' pair '}' <|> Array <$> commaGroup '[' value ']' <|> Bool True <$ string "true" <|> Bool False <$ string "false" <|> Null <$ string "null"

Page 136: Haskell Tour (Part 2)

Preview: Parse JSON

pair :: Parser (String, Value)pair = do s <- jsstring sp_char_sp ':' v <- value spaces return (s, v)

Page 137: Haskell Tour (Part 2)

To be continued...