introduction to functional programming in...

55
Introduction to Functional Programming in Haskell 1 / 55

Upload: phamtruc

Post on 13-May-2018

241 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Introduction to Functional Programming in Haskell

1 / 55

Page 2: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programmingWhat is a function?Equational reasoningFirst-order vs. higher-order functionsLazy evaluation

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

2 / 55

Page 3: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional program

Type inference

Why learn functional programming? 3 / 55

Page 4: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Why learn (pure) functional programming?

1. This course: strong correspondence of core concepts to PL theory• abstract syntax can be represented by algebraic data types• denotational semantics can be represented by functions

2. It will make you a better (imperative) programmer• forces you to think recursively and compositionally• forces you to minimize use of state

. . . essential skills for solving big problems

3. It is the future!• more scalable and parallelizable• functional features have been added to most mainstream languages• many cool new libraries built around functional paradigm

Why learn functional programming? 4 / 55

Page 5: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Quotes from pragmatists

Programming is not about data. It’s about transforming data . . .That’s why I think functional programming is a natural successor toobject-oriented programming. In OOP, we’re constantly concerned aboutthe state of our data. In functional programming, our focus is on thetransformation of data. And transformation is where the value is added.

—Dave Thomas, The Pragmatic Programmer

Why learn functional programming? 5 / 55

Page 6: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Quotes from pragmatists

Without understanding functional programming, you can’t invent MapReduce,the algorithm that makes Google so massively scalable.

—Joel Spolsky, Joel on Software

Why learn functional programming? 6 / 55

Page 7: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Quotes from pragmatists

So that’s the big deal about functional languages; and it is one big frickingdeal. There is a freight train barreling down the tracks towards us, withmulti-core emblazoned on it; and you’d better be ready by the time it gets here.

—Robert C. Martin, a.k.a. “Uncle Bob”

Why learn functional programming? 7 / 55

Page 8: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programmingWhat is a function?Equational reasoningFirst-order vs. higher-order functionsLazy evaluation

How to functional program

Type inference

The essence of functional programming 8 / 55

Page 9: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

What is a (pure) function?

A function is pure if:• it always returns the same output for the same inputs• it doesn’t do anything else — no “side effects”

In Haskell: whenever we say “function” we mean a pure function!

The essence of functional programming 9 / 55

Page 10: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

What are and aren’t functions?

Always functions:• mathematical functions f (x) = x2 + 2x + 3• encryption and compression algorithms

Usually not functions:• C, Python, JavaScript, . . . “functions” (procedures)• Java, C#, Ruby, . . . methods

Haskell only allows you to write (pure) functions!

The essence of functional programming 10 / 55

Page 11: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Why procedures/methods aren’t functions

• output depends on environment• may perform arbitrary side effects

The essence of functional programming 11 / 55

Page 12: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programmingWhat is a function?Equational reasoningFirst-order vs. higher-order functionsLazy evaluation

How to functional program

Type inference

The essence of functional programming 12 / 55

Page 13: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Getting into the Haskell mindset

Haskellsum :: [Int] -> Intsum [] = 0sum (x:xs) = x + sum xs

Javaint sum(List<Int> xs) {int s = 0;for (int x : xs) {s = s + x;

}return s;

}In Haskell, “=” means is not change to!

The essence of functional programming 13 / 55

Page 14: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Getting into the Haskell mindset

Quicksort in Haskellqsort :: Ord a => [a] -> [a]qsort [] = []qsort (x:xs) = qsort (filter (<= x) xs)

++ [x] ++ qsort (filter (> x) xs)

Quicksort in Cvoid qsort(int low, int high) {int i = low, j = high;int pivot = numbers[low + (high-low)/2];

while (i <= j) {while (numbers[i] < pivot) {i++;

}while (numbers[j] > pivot) {j--;

}if (i <= j) {swap(i, j);i++;j--;

}}if (low < j)qsort(low, j);

if (i < high)qsort(i, high);

}

void swap(int i, int j) {int temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;

}

The essence of functional programming 14 / 55

Page 15: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Referential transparency

An expression can be replaced by its valuewithout changing the overall program behavior

length [1,2,3] + 4⇒ 3 + 4

what if length was a Java method?

Corollary: an expression can be replaced by any expressionwith the same value without changing program behavior

Supports equational reasoning

The essence of functional programming 15 / 55

a.k.a. referent

Page 16: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Equational reasoning

Computation is just substitution!

sum :: [Int] -> Intsum [] = 0sum (x:xs) = x + sum xs

equations

sum [2,3,4]

⇒ sum (2:(3:(4:[])))

⇒ 2 + sum (3:(4:[]))

⇒ 2 + 3 + sum (4:[])

⇒ 2 + 3 + 4 + sum []

⇒ 2 + 3 + 4 + 0

⇒ 9

The essence of functional programming 16 / 55

Page 17: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Describing computations

Function definition: a list of equations that relate inputs to output• matched top-to-bottom• applied left-to-right

Example: reversing a listimperative view: how do I rearrange the elements in the list? 7functional view: how is a list related to its reversal? 3

reverse :: [a] -> [a]reverse [] = []reverse (x:xs) = reverse xs ++ [x]

The essence of functional programming 17 / 55

Page 18: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Exercise

1. Evaluate: double (succ (double 3))

A : 12 B : 14 C : 16

2. Prove, up to associativity of (+), using equational reasoning:

double (succ x) = succ (succ (double x))

The essence of functional programming 18 / 55

succ :: Int -> Intsucc x = x + 1

double :: Int -> Intdouble x = x + x

Page 19: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Exercise

1. Evaluate: foo (foo 0 0) 0

A : 0 B : 2 C : 3

2. Evaluate: foo 0 (foo 0 0)

A : 0 B : 2 C : 3

The essence of functional programming 19 / 55

foo :: Int -> Int -> Intfoo 0 x = x + 1foo x 0 = x + 2foo x y = x + y

Page 20: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programmingWhat is a function?Equational reasoningFirst-order vs. higher-order functionsLazy evaluation

How to functional program

Type inference

The essence of functional programming 20 / 55

Page 21: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

First-order functions

Examples• cos :: Float -> Float• even :: Int -> Bool• length :: [a] -> Int

The essence of functional programming 21 / 55

Page 22: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Higher-order functions

Examples• map :: (a -> b) -> [a] -> [b]• filter :: (a -> Bool) -> [a] -> [a]• (.) :: (b -> c) -> (a -> b) -> a -> c

The essence of functional programming 22 / 55

Page 23: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Higher-order functions as control structures

map: loop for doing something to each element in a list

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

map f [2,3,4,5] = [f 2, f 3, f 4, f 5]

map even [2,3,4,5]= [even 2, even 3, even 4, even 5]= [True,False,True,False]

fold: loop for aggregating elements in a list

foldr :: (a->b->b) -> b -> [a] -> bfoldr f y [] = yfoldr f y (x:xs) = f x (foldr f y xs)

foldr f y [2,3,4] = f 2 (f 3 (f 4 y))

foldr (+) 0 [2,3,4]= (+) 2 ((+) 3 ((+) 4 0))= 2 + (3 + (4 + 0))= 9

The essence of functional programming 23 / 55

Page 24: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Function composition

Can create new functions by composing existing functions• apply the second function, then apply the first

Function composition(.) :: (b -> c) -> (a -> b) -> a -> cf . g = \x -> f (g x)

(f . g) x = f (g x)

Types of existing functionsnot :: Bool -> Boolsucc :: Int -> Inteven :: Int -> Boolhead :: [a] -> atail :: [a] -> [a]

Definitions of new functionsplus2 = succ . succodd = not . evensecond = head . taildrop2 = tail . tail

The essence of functional programming 24 / 55

Page 25: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Currying / partial application

In Haskell, functions that take multiple arguments areimplicitly higher order

plus :: Int -> Int -> Int

increment :: Int -> Intincrement = plus 1

Curried plus 2 3plus :: Int -> Int -> Int

Uncurried plus (2,3)plus :: (Int,Int) -> Int

a pair of intsThe essence of functional programming 25 / 55

Haskell Curry

Page 26: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programmingWhat is a function?Equational reasoningFirst-order vs. higher-order functionsLazy evaluation

How to functional program

Type inference

The essence of functional programming 26 / 55

Page 27: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Lazy evaluation

In Haskell, expressions are reduced:• only when needed• at most once

Supports:• infinite data structures• separation of concerns

nats :: [Int]nats = 1 : map (+1) nats

fact :: Int -> Intfact n = product (take n nats)

min3 :: [Int] -> [Int]min3 = take 3 . sort

What is the running time of this function?

The essence of functional programming 27 / 55

Page 28: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 28 / 55

Page 29: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Functional programming workflow

“obsessive compulsive refactoring disorder”

How to functional program 29 / 55

Page 30: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

FP workflow (detailed)

How to functional program 30 / 55

Norman Ramsey, On Teaching “How to Design Programs”, ICFP’14

Page 31: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 31 / 55

Page 32: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Algebraic data types

Data type definition• introduces new type of value• enumerates ways to constructvalues of this type

Some example data typesdata Bool = True | False

data Nat = Zero | Succ Nat

data Tree = Node Int Tree Tree| Leaf Int

Definitions consists of . . .• a type name• a list of data constructorswith argument types

Definition is inductive• the arguments may recursivelyinclude the type being defined

• the constructors are the only wayto build values of this type

How to functional program 32 / 55

Page 33: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Anatomy of a data type definition

type name

data Expr = Lit Int| Plus Expr Expr cases

data constructor types of arguments

Example: 2+ 3+ 4 Plus (Lit 2) (Plus (Lit 3) (Lit 4))

How to functional program 33 / 55

Page 34: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

FP data types vs. OO classes

Haskelldata Tree = Node Int Tree Tree

| Leaf

• separation of type- and value-level• set of cases closed• set of operations open

Javaabstract class Tree { ... }class Node extends Tree {int label;Tree left, right;...

}class Leaf extends Tree { ... }

• merger of type- and value-level• set of cases open• set of operations closed

Extensibility of cases vs. operations = the “expression problem”

How to functional program 34 / 55

Page 35: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Type parameters

(Like generics in Java)type parameter

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

reference totype parameter

recursivereference to type

Specialized liststype IntList = List Inttype CharList = List Chartype RaggedMatrix a = List (List a)

How to functional program 35 / 55

Page 36: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 36 / 55

Page 37: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

What is a type class?

1. an interface that is supported by many different types2. a set of types that have a common behavior

class Eq a where(==) :: a -> a -> Bool

types whose values can becompared for equality

class Show a whereshow :: a -> String

types whose values can beshown as strings

class Num a where(+) :: a -> a -> a(*) :: a -> a -> anegate :: a -> a...

types whose values can bemanipulated like numbers

How to functional program 37 / 55

Page 38: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Type constraints

List elements can be of any typelength :: [a] -> Intlength [] = 0length (_:xs) = 1 + length xs

List elements must support equality!elem :: Eq a => a -> [a] -> Boolelem _ [] = Falseelem y (x:xs) = x == y || elem y xs

use method⇒ add type class constraint

How to functional program 38 / 55

class Eq a where(==) :: a -> a -> Bool

Page 39: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 39 / 55

Page 40: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Tools for defining functions

Recursion and other functionssum :: [Int] -> Intsum xs = if null xs then 0

else head xs + sum (tail xs)

(1) case analysis

Pattern matchingsum :: [Int] -> Intsum [] = 0sum (x:xs) = x + sum xs

(2) decompositionHigher-order functionssum :: [Int] -> Intsum = foldr (+) 0

no recursion or variables needed!How to functional program 40 / 55

Page 41: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

What is type-directed programming?

How to functional program 41 / 55

Use the type of a functionto help write its body

Page 42: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Type-directed programming

Basic goal: transform values of argument types into result type

If argument type is . . .

• atomic type (e.g. Int, Char)• apply functions to it

• algebraic data type• use pattern matching

• case analysis• decompose into parts

• function type• apply it to something

If result type is . . .• atomic type

• output of another function

• algebraic data type• build with data constructor

• function type• function composition orpartial application

• build with lambda abstraction

How to functional program 42 / 55

Page 43: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 43 / 55

Page 44: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Good Haskell style

Why it matters:• layout is significant!• eliminate misconceptions• we care about elegance

Easy stuff:• use spaces! (tabs cause layout errors)• align patterns and guards

See style guides on course web page

How to functional program 44 / 55

Page 45: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Formatting function applications

Function application:• is just a space• associates to the left• binds most strongly

f(x) f x

(f x) y f x y

(f x) + (g y) f x + g y

Use parentheses only to override this behavior:• f (g x)• f (x + y)

How to functional program 45 / 55

Page 46: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional programFunctional programming workflowData typesType classesType-directed programmingHaskell styleRefactoring (bonus section)

Type inference

How to functional program 46 / 55

Page 47: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Refactoring in the FP workflow

“obsessive compulsive refactoring disorder”

Motivations:• separate concerns• promote reuse• promote understandability• gain insights

How to functional program 47 / 55

Page 48: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Refactoring relations

Semantics-preserving laws prove with equational reasoning and/or induction

• Eta reduction:\x -> f x ≡ f

• Map–map fusion:map f . map g ≡ map (f . g)

• Fold–map fusion:foldr f b . map g ≡ foldr (f . g) b

“Algebra of computer programs”

John Backus, Can Programming be Liberated from the von Neumann Style?, ACM Turing Award Lecture, 1978

How to functional program 48 / 55

Page 49: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Strategy: systematic generalization

commas :: [String] -> [String]commas [] = []commas [x] = [x]commas (x:xs) = x : ", " : commas xs

Introduce parameters for constantsseps :: String -> [String] -> [String]seps _ [] = []seps _ [x] = [x]seps s (x:xs) = x : s : seps s xs

Broaden the typesintersperse :: a -> [a] -> [a]intersperse _ [] = []intersperse _ [x] = [x]intersperse s (x:xs) = x : s : intersperse s xs

How to functional program 49 / 55

commas :: [String] -> [String]commas = intersperse ", "

Page 50: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Strategy: abstract repeated templates

abstract (v): extract and make reusable (as a function)

showResult :: Maybe Float -> StringshowResult Nothing = "ERROR"showResult (Just v) = show v

moveCommand :: Maybe Dir -> CommandmoveCommand Nothing = StaymoveCommand (Just d) = Move d

safeAdd :: Int -> Maybe Int -> IntsafeAdd x Nothing = xsafeAdd x (Just y) = x + y

Repeated structure:• pattern match• default value if Nothing• apply function to contents if Just

How to functional program 50 / 55

Page 51: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Strategy: abstract repeated templates

Describe repeated structure in functionmaybe :: b -> (a -> b) -> Maybe a -> bmaybe b _ Nothing = bmaybe _ f (Just a) = f a

Reuse in implementationsshowResult = maybe "ERROR" showmoveCommand = maybe Stay MovesafeAdd x = maybe x (x+)

How to functional program 51 / 55

Page 52: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Refactoring data types

data Expr = Var Name| Add Expr Expr| Sub Expr Expr| Mul Expr Expr

vars :: Expr -> [Name]vars (Var x) = [x]vars (Add l r) = vars l ++ vars rvars (Sub l r) = vars l ++ vars rvars (Mul l r) = vars l ++ vars r

eval :: Env -> Expr -> Inteval m (Var x) = get x meval m (Add l r) = eval m l + eval m reval m (Sub l r) = eval m l - eval m reval m (Mul l r) = eval m l * eval m r

How to functional program 52 / 55

Page 53: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Refactoring data types

Factor out shared structuredata Expr = Var Name

| BinOp Op Expr Expr

data Op = Add | Sub | Mul

vars :: Expr -> [Name]vars (Var x) = [x]vars (BinOp _ l r) = vars l ++ vars r

eval :: Env -> Expr -> Inteval m (Var x) = get x meval m (BinOp o l r) = op o (eval m l) (eval m r)whereop Add = (+)op Sub = (-)op Mul = (*)

How to functional program 53 / 55

Page 54: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Outline

Why learn functional programming?

The essence of functional programming

How to functional program

Type inference

Type inference 54 / 55

Page 55: Introduction to Functional Programming in Haskellweb.engr.oregonstate.edu/.../slides/1.FunctionalProgramming.pdf · Why learn functional programming? ... imperative view: how do I

Type inference

How to perform type inferenceIf a literal, data constructor, or named function: write down the type – you’re done!

Otherwise:1. expand any syntactic sugar2. pick an application e1 e23. recursively infer their types e1 : T1 and e2 : T24. T1 should be a function type T1 = Targ → Tres5. unify Targ =? T2, yielding type variable assignment σ6. return e1 e2 : σTres (Tres with type variables substituted)If any of these steps fails, it is a type error!

Type inference 55 / 55