# Functional Programming and Haskell - TWBR Away Day 2011

Post on 12-May-2015

271 views

Embed Size (px)

DESCRIPTION

Explains why functional programming is back and shows some features from Haskell that are being ported to other languages. Presented at ThoughtWorks Brazil Away Day 2011.TRANSCRIPT

<ul><li>1.Functional Programming with Haskell Adriano Bonat abonat@thoughtworks.com @tanob </li></ul>
<p>2. Why FP? Source of new ideas Expressiveness Multi-core CPUs Different paradigm New ideas: Garbage collection (LISP) Type inference (simply typed lambda calculus) Generics Type classes Expressiveness: DSLs 3. What is it? Different programming paradigm OO Logic Procedural Functions are the main element in the language 4. Function applications Functional programming is so called because a program consists entirely of functions. [...] Typically the main function is dened in terms of other functions, which in turn are dened in terms of still more functions, until at the bottom level the functions are language primitives. John Hughes, 1989 -Why functional programming matters 5. Origin Alonzo Church developed Lambda Calculus as part of his investigations on Math foundations on 1936. 6. Lambda Calculus Variables Expressions (e1 e2) Lambda abstractions (x. e) 7. Lambda Calculus (I) true = xy. x false = xy. y NOT a = (a)(false)(true) a AND b = (a)(b)(false) a OR b = (a)(true)(b) a XOR b = (a)((b)(false)(true))(b) 8. Haskell Academic origin Named in honor of Haskell Curry Dened by a committee First version released on 98 (Haskell 98) 9. Features Pureness Type Inference Algebraic datatypes (ADTs) Pattern Matching Lazyness High Order Functions Currication (aka Partial Application) Type Classes Monads 10. Pureness No side-effects A function call can have no effect other than to compute its result Expressions can be evaluated at any time Programs are referentially transparent Good for: * reasoning * compiler optimization * concurrency 11. Type Inference Lets see the types for these declarations: four = 4 add x y = x + y emphasize x = x ++ ! 12. Algebraic datatypes Enumeration: data Season = Summer | Winter | Autumn | Spring Product: data Pair = Pair Int Int Sum: data Shape = Circle Float | Rect Float Float Polymorc & Recursive: data Tree a = Leaf a | Node (Tree a) (Tree a) 13. Algebraic datatypes (I) data Maybe a = Nothing | Just a data Either a b = Left a | Right b 14. Pattern Matching Denition: sum [] = 0 sum (elem:rest) = elem + sum rest Application: sum [1,2,3,10] 15. Pattern Matching (I) area (Circle rad) = pi * rad ^ 2 area (Rect width height) = width * height rst (Pair value _) = value 16. High Order Functions Functions which at least: Receive functions as parameters Return functions (aka curried functions) 17. High Order Functions (I) map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs 18. Currication add :: Int -> Int -> Int add x y = x + y inc :: Int -> Int inc = add 1 19. Lazyness aka call by need Expressions can be evaluated when necessary Allows the use of innite lists Being pure helps here 20. Lazyness (I) Denition: even_numbers :: [Int] even_numbers = filter even [1..] Application: take 5 even_numbers 21. Lazyness (II) fibs :: [Int] fibs = 0 : 1 : zipWith (+) fibs (tail fibs) From: http://en.wikipedia.org/wiki/Lazy_evaluation 22. Type Classes Created to solve the problem with numeric operator overload and equality testing Some type classes dened by Haskell 98: Eq Read/Show 23. Type Classes (I) class Eq a where (==), (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) You can define what is called a minimal implementation. 24. Type Classes (II) data User = User { name :: String } instance Eq User where user1 == user2 = name user1 == name user2 instance Show User where show user = name user 25. Automatic Derivation data Season = Summer | Winter | Autumn | Spring deriving (Show, Eq) show Summer > Summer Summer /=Winter > True 26. Monads Adds to the type system a way to describe actions The actions will happen in a certain order 27. Monads Common monads: IO State Reader Maybe 28. Monads thing1 >>= x -> func1 x >>= y -> thing2 >>= _ -> func2 y >>= z -> return z do x (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a return is a bad name, it actually injects a value into the monadic type. 30. Logger Monad type Log = [String] data Logger resultType = Logger (resultType, Log) deriving Show record x = Logger ((), [x]) instance Monad Logger where return value = Logger (value, []) prevLogger >>= nextAction = let Logger (prevResult, prevLog) = prevLogger Logger (newResult, newLog) = nextAction prevResult in Logger (newResult, prevLog ++ newLog) 31. Testing? Go read about QuickCheck! 32. Want to learn more? Freely available online: http://book.realworldhaskell.org/ 33. Your Knowledge Portfolio "Learn at least one new language every year. [...] Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut." The Pragmatic Programmer 34. Functional Programming with Haskell Adriano Bonat abonat@thoughtworks.com @tanob </p>

Recommended

View more >