# 04. haskell handling

Post on 11-May-2015

185 views

Embed Size (px)

TRANSCRIPT

<ul><li>1.Handling Sebastian RettigRecursion is important to Haskell because unlike imperative Recursion is important to Haskell because unlike imperativelanguages, you do computations in Haskell by declaring languages, you do computations in Haskell by declaringwhat something is instead of declaring how you get it. ([1]) what something is instead of declaring how you get it. ([1])</li></ul>
<p>2. Functional Programming No Variables Functions only, eventually stored in Modules Behavior do not change, once defined Function called with same parametercalculates always the same result Function definitions (Match Cases) Recursion (Memory) 3. Haskell Features Pure Functional Programming Language Lazy Evaluation Pattern Matching and Guards List Comprehension Type Polymorphism 4. How to write Functions? eventually think about imperative function and translate into recursive function generally the same schema to go for: 1. define simple cases (recursion anchor) 2. define the recursion call lets start with imperative functions 5. How to implement the Factorial? Remember:Recursion is important to Haskell because unlike imperativelanguages, you do computations in Haskell by declaring whatsomething is instead of declaring how you get it. ([1]) Okay, then look at the definition: Imperative definition Recursive definition 6. Lets look at the imperative way... Imperative Recursivefunction factorial(n) {int result = 1;if (n == 0)return result;}for (int i=1; i [Int] -> [Int]myMap v [] = [] --Recursion Anchor!myMap v (x:xs) = [v*x] ++ myMap v xs Recursion Anchor contains the break rule endless loop = anchorless recursion isTrue :: BoolBool isTrue b = b && isTrue b 9. Recursion (2) Recursion vs. Final Recursion:countX :: Int -> [Int] -> Int Hugs> countX 3 [1,4,3,5,3]countX x [] = 02countX x (y:ys)| x==y = 1 + countX x ys| otherwise = countX x ys countXFinal :: Int -> [Int] -> Int -> Int countXFinal x [] accu = accu countXFinal x (y:ys) accu | x==y = countXFinal x ys accu+1 | otherwise = countXFinal x ys accu use accumulator to reduce stack usage Hugs> countXFinal 3 [1,4,3,5,3] 02 10. Where & let .. in additional definitions let .. in defines scope of usage let = definition in = scope of definition e.g.: add x = let a=9 in a + x where has scope in whole function e.g.: add x = a + xwhere a=9 11. The maximum value of a List? Remember:Recursion is important to Haskell because unlike imperativelanguages, you do computations in Haskell by declaring whatsomething is instead of declaring how you get it. ([1]) Okay, then look at the definition: 12. Lets look at the imperative way... Imperative Recursivefunction max(array list) {if (empty(list)) {throw new Exception();}max = list[0]for (int i=0; i max) {max = list[i];}}return max;} 13. and translate to the functional way Imperative Recursivefunction max(array list) {maxList [] = error emptyif (empty(list)) {maxList [x] = xthrow new Exception();maxList (x:xs)} | x > maxTail = xmax = list[0] | otherwise = maxTailfor (int i=0; i max) { or simpler:max = list[i];maxList [] = error empty} maxList [x] = x} maxList (x:xs) =return max;max x (maxList xs)} and in comparison with thedefinition: 14. Final Recursion Get maximum element of list in final recursionmaxFinal :: [Int] -> Int -> IntmaxFinal [] accu = accumaxFinal (x:xs) accu | x > accu = maxFinal xs x | otherwise = maxFinal xs accu often the same Schema to program there exist functions in haskell to simplify the all day work :) 15. Simple Recursion Helper map foldl, foldr, foldl1, foldr1 scanl, scanr, scanl1, scanr1 etc... 16. Lambda Functions often called as Inline Functions in otherlanguages Syntax: e.g.: a b -> a+b map (x -> x+3) [2,3,4] returns [5,6,7] 17. Folding, Scanning (1) e.g.: How to get the max of an array? imperative: int max = 0; foreach (entry in list) {max = (entry > max) ? entry : max; } functional: let list = [8,6,4,1,7,3,5] foldl (acc x -> if x > acc then x else acc) 0 list 18. Folding, Scanning (2) scan shows the accumulator state onevery recursion step: scanl (acc x -> if x > acc then x else acc) 0 list returns: [0,8,8,8,8,8,8,8] good for debugging good to understand recursion 19. Folding, Scanning (3) foldl versus foldr: first we look at the Header of the functions: Prelude> :t foldl foldl :: (a -> b -> a) -> a -> [b] -> a Prelude> :t foldr foldr :: (a -> b -> b) -> b -> [a] -> b What is the difference? 20. Folding, Scanning (4) foldl versus foldr: first we look at the Header of the functions: Prelude> :t foldl foldl :: (a -> b -> a) -> a -> [b] -> a Prelude> :t foldr foldr :: (a -> b -> b) -> b -> [a] -> b What is the difference? accumulator and parameter are switched!!! 21. Infix, Prefix, Postfix Infix (usable in Haskell): 2 + 3 2 `mod` 3 Prefix (usable in Haskell): (+) 2 3 mod 2 3 Postfix (used in stack machines): 32+ 22. Sources[1] Haskell-Tutorial: Learn you a Haskell (http://learnyouahaskell.com/,2012/03/15)[2] The Hugs User-Manual (http://cvs.haskell.org/Hugs/pages/hugsman/index.html, 2012/03/15)[3] The Haskellwiki (http://www.haskell.org/haskellwiki, 2012/03/15) </p>