csci 2325 functional programming with haskell
play

CSCI-2325 Functional Programming with Haskell Mohammad T . Irfan - PDF document

12/2/2013 CSCI-2325 Functional Programming with Haskell Mohammad T . Irfan 12/2/13 Recap: Functional Programming 1 12/2/2013 Functional Programming Mimic mathematical functions No variables No assignment statements How


  1. 12/2/2013 CSCI-2325 Functional Programming with Haskell Mohammad T . Irfan 12/2/13 Recap: Functional Programming 1

  2. 12/2/2013 Functional Programming  Mimic mathematical functions  No variables  No assignment statements  How about iterative statement?  Alternative?  Context-independent  Referential transparency Interesting facts: LISP and LISP Machine John McCarthy Knight machine LISP(1958) (1980s) 2

  3. 12/2/2013 Core concept: λ calculus  Alonzo Church (1941)  λ expression  Parameters and mapping of a function  No name  Example  λ (x) x * x * x  Evaluation: ( λ (x) x * x * x)(2) produces 8 Haskell 3

  4. 12/2/2013 Resources  Installation  http://www.haskell.org/platform/  Haskell (GHCi) commands  http://www.haskell.org/ghc/docs/7.4.1/html/users_gui de/ghci-commands.html  Learning  Best book: Miran Lipovaca’s Learn You a Haskell for Great Good!  http://learnyouahaskell.com/ (free online version)  Useful how-to page  http://www.haskell.org/haskellwiki/Category:How_to  Other resources: http://www.haskell.org/haskellwiki/Learning_Haskell 4

  5. 12/2/2013 Haskell Warm-up exercises Elementary functions  Make a myFunctions.hs file and define the following functions in it  doubleMe x = x + x  addSquares x y = x*x + y*y  Using the terminal go to the folder of that .hs file  Execute this command: ghci  Load the .hs file  :load myFunctions.hs (or, :l myFunctions.hs)  Use your functions  addSquares 5 10  If you change the .hs file => Execute :r to reload 5

  6. 12/2/2013 Recursion – Fibonacci numbers  fibonacci n = if n == 0 then 1 else if n == 1 then 1 else if n > 1 then fibonacci (n-1)+fibonacci (n-2) else 0  fib n | n == 0 = 1 | n == 1 = 1 Guard | n > 1 = fib (n-1) + fib (n-2) | otherwise = 0 Recursion – factorial  factorial n | n == 0 = 1 | n > 0 = n * factorial (n-1) -- why not factorial n – 1 ? Comment  Try this: factorial 100 6

  7. 12/2/2013 Recursion – sorting  sort [] = [] Empty list  sort (head:remainingList) = sort [b | b <- remainingList, b < head] ++ [head] ++ sort [b | b <- remainingList, b >= head] List generator Lists  evens = [0, 2 .. 10]  In terminal (ghci): let evens = [0, 2 .. 10]  evens = [2*x | x <- [0..5] ]  Infinite lists  allEvens = [0, 2 ..] Are these assignment statements? 7

  8. 12/2/2013 Anatomy of a list  Two parts  head  List of the remaining elements (AKA tail)  Functions head and tail return these  head evens  tail evens  Joining head and tail by : operator  0 : [2, 4 .. 10] will give [0, 2, 4, 6, 8, 10]  Reference  http://www.haskell.org/haskellwiki/How_to_work_on_lists More list examples  Factors of a number n  factors n = [f | f <- [1 .. n], mod n f == 0]  Prime numbers  primes = primeGen' [2 ..] where primeGen' (p:xs) = p : primeGen' [q | q <- xs, mod q p /= 0]  Getting the first 10 prime numbers  take 10 primes Lazy evaluation  Side note: This is not really the sieve of Eratosthenes http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP .pdf 8

  9. 12/2/2013 Recursion vs. iteration  Iterative factorial  factorial n = product [1 .. n]  Iterative sum  sum [1 .. 5]  Recursive sum  recSum [] = 0 recSum (x:xs) = x + recSum xs recSum is polymorphic (Works with any compatible type) n-queens problem queens n = solve n where solve k | k <= 0 = [ [] ] | otherwise = [ h:partial | partial <- solve (k-1), h <- [0..(n-1)], safe h partial] safe h partial = and [ not ( checks h partial i) | i <- [0..(length partial - 1)]] checks h partial i = h == partial!!i || abs(h - partial!!i) == i+1 9

Recommend


More recommend