91
An Introduction to Functional Programming Andreas Pauley – @apauley Pattern Matched Technologies Lambda Luminaries @lambdaluminary September 2, 2013 Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary) Functional Programming September 2, 2013 1 / 58

Introduction to Functional Programming

Embed Size (px)

Citation preview

Page 1: Introduction to Functional Programming

An Introduction to Functional Programming

Andreas Pauley – @apauley

Pattern Matched TechnologiesLambda Luminaries @lambdaluminary

September 2, 2013

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 1 / 58

Page 2: Introduction to Functional Programming

Pattern Matched Technologies

Developing financial applications in Erlang.http://www.patternmatched.com/

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 2 / 58

Page 3: Introduction to Functional Programming

Lambda Luminaries – @lambdaluminaryLocal functional programming user group

We meet once a month, on the second Monday of the month.http://www.meetup.com/lambda-luminaries/

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 3 / 58

Page 4: Introduction to Functional Programming

Introduction

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 4 / 58

Page 5: Introduction to Functional Programming

Introduction

A word from the wise

“ No matter what language you work in, programming ina functional style provides benefits. You should do itwhenever it is convenient, and you should think hardabout the decision when it isn’t convenient. ”

— John Carmack, ID Software [2]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 5 / 58

Page 6: Introduction to Functional Programming

Introduction

Quake

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 6 / 58

Page 7: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 8: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 9: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 10: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 11: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 12: Introduction to Functional Programming

Introduction

A Few Functional Programming Languages

Haskell Strong focus on functional purity. Lazy evaluation.Advanced static type system. Native-code compiler.

Erlang Focused around concurrency and distributed programming.Strict evaluation. Dynamic typing. Runs on the BEAM VM.

Clojure A modern Lisp language. Focus on concurrency. Lazyevaluation. Dynamic typing. Runs on the JVM.

Scala FP and OO. Strict evaluation by default, but supports lazyevaluation. Advanced static type system. Runs on the JVM.

OCaml FP and OO. Part of the ML family. Sometimes claimed tobe “faster than C”. Strict evaluation. Advanced static typesystem. Native-code compiler.

F# FP and OO. Based on OCaml. Strict evaluation by default,but supports lazy evaluation. Advanced static type system.Runs on the .NET CLR.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 7 / 58

Page 13: Introduction to Functional Programming

Definition of Functional Programming

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 8 / 58

Page 14: Introduction to Functional Programming

Definition of Functional Programming

So what exactly is Functional Programming?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 9 / 58

Page 15: Introduction to Functional Programming

Definition of Functional Programming

Functional Programming, noun:

“ Functional Programming is a listof things you CAN’T do. ”

[7]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 10 / 58

Page 16: Introduction to Functional Programming

Definition of Functional Programming

When programming in a functional style/language:

You can’t vary your variables.

You can’t mutate or change your state.

No while/for loops, sorry.

You can’t have side-effects.

You can’t control the order of execution (lazy evaluated languages).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 11 / 58

Page 17: Introduction to Functional Programming

Definition of Functional Programming

When programming in a functional style/language:

You can’t vary your variables.

You can’t mutate or change your state.

No while/for loops, sorry.

You can’t have side-effects.

You can’t control the order of execution (lazy evaluated languages).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 11 / 58

Page 18: Introduction to Functional Programming

Definition of Functional Programming

When programming in a functional style/language:

You can’t vary your variables.

You can’t mutate or change your state.

No while/for loops, sorry.

You can’t have side-effects.

You can’t control the order of execution (lazy evaluated languages).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 11 / 58

Page 19: Introduction to Functional Programming

Definition of Functional Programming

When programming in a functional style/language:

You can’t vary your variables.

You can’t mutate or change your state.

No while/for loops, sorry.

You can’t have side-effects.

You can’t control the order of execution (lazy evaluated languages).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 11 / 58

Page 20: Introduction to Functional Programming

Definition of Functional Programming

When programming in a functional style/language:

You can’t vary your variables.

You can’t mutate or change your state.

No while/for loops, sorry.

You can’t have side-effects.

You can’t control the order of execution (lazy evaluated languages).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 11 / 58

Page 21: Introduction to Functional Programming

Definition of Functional Programming

Are you kidding me?

How can anyone program like this???

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 12 / 58

Page 22: Introduction to Functional Programming

Definition of Functional Programming

GOTO 10

This sounds like

“You can’t have GOTO statements”

See Hughes and Dijkstra [1, 3]

Also framed in the negative (you can’t).

In hindsight we don’t really need GOTO’s.

In hindsight it is not about what you cannot do.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 13 / 58

Page 23: Introduction to Functional Programming

Definition of Functional Programming

GOTO 10

This sounds like

“You can’t have GOTO statements”

See Hughes and Dijkstra [1, 3]

Also framed in the negative (you can’t).

In hindsight we don’t really need GOTO’s.

In hindsight it is not about what you cannot do.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 13 / 58

Page 24: Introduction to Functional Programming

Definition of Functional Programming

GOTO 10

This sounds like

“You can’t have GOTO statements”

See Hughes and Dijkstra [1, 3]

Also framed in the negative (you can’t).

In hindsight we don’t really need GOTO’s.

In hindsight it is not about what you cannot do.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 13 / 58

Page 25: Introduction to Functional Programming

Definition of Functional Programming

Structured Programming and Functional Programming

Structured Programming introduced subroutines with fixed entry/exitpoints (instead of GOTO’s), resulting in improvedmodularity.

Functional Programming provides similar important benefits – more aboutthis later.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 14 / 58

Page 26: Introduction to Functional Programming

Definition of Functional Programming

Structured Programming and Functional Programming

Structured Programming introduced subroutines with fixed entry/exitpoints (instead of GOTO’s), resulting in improvedmodularity.

Functional Programming provides similar important benefits – more aboutthis later.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 14 / 58

Page 27: Introduction to Functional Programming

Definition of Functional Programming

We need a better definition for Functional Programming.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 15 / 58

Page 28: Introduction to Functional Programming

Definition of Functional Programming

Functional Programming, noun:

“ Functional programming is so called because a programconsists entirely of functions. ”

— John Hughes, Why Functional Programming Matters [1, p. 1]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 16 / 58

Page 29: Introduction to Functional Programming

Definition of Functional Programming

OK... so what exactly is a function?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 17 / 58

Page 30: Introduction to Functional Programming

Function Recap

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 18 / 58

Page 31: Introduction to Functional Programming

Function Recap

An example function

f (x) = 2x + 3

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 19 / 58

Page 32: Introduction to Functional Programming

Function Recap

Variables in functions

f (x) = 2x + 3When we evaluate the function:

f (4) = 2 ∗ 4 + 3 = 11

The value of x will not change inside the function body.

No x = 4 and later x = 21 in the same function body.

Same input, same output. Every time.

In other words, we can replace any occurrence of f (4) with 11(Referential Transparency)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 20 / 58

Page 33: Introduction to Functional Programming

Function Recap

Variables in functions

f (x) = 2x + 3When we evaluate the function:

f (4) = 2 ∗ 4 + 3 = 11

The value of x will not change inside the function body.

No x = 4 and later x = 21 in the same function body.

Same input, same output. Every time.

In other words, we can replace any occurrence of f (4) with 11(Referential Transparency)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 20 / 58

Page 34: Introduction to Functional Programming

Function Recap

Variables in functions

f (x) = 2x + 3When we evaluate the function:

f (4) = 2 ∗ 4 + 3 = 11

The value of x will not change inside the function body.

No x = 4 and later x = 21 in the same function body.

Same input, same output. Every time.

In other words, we can replace any occurrence of f (4) with 11(Referential Transparency)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 20 / 58

Page 35: Introduction to Functional Programming

Function Recap

Variables in functions

f (x) = 2x + 3When we evaluate the function:

f (4) = 2 ∗ 4 + 3 = 11

The value of x will not change inside the function body.

No x = 4 and later x = 21 in the same function body.

Same input, same output. Every time.

In other words, we can replace any occurrence of f (4) with 11(Referential Transparency)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 20 / 58

Page 36: Introduction to Functional Programming

Function Recap

Variables in functions

f (x) = 2x + 3When we evaluate the function:

f (4) = 2 ∗ 4 + 3 = 11

The value of x will not change inside the function body.

No x = 4 and later x = 21 in the same function body.

Same input, same output. Every time.

In other words, we can replace any occurrence of f (4) with 11(Referential Transparency)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 20 / 58

Page 37: Introduction to Functional Programming

Function Recap

Functions can call other functions

g(x) = f (x) + 1

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 21 / 58

Page 38: Introduction to Functional Programming

Function Recap

Values are functions

Constant values are just functions with no input parameters

k = 42def k():

return 42

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 22 / 58

Page 39: Introduction to Functional Programming

Function Recap

Functions can be combined

h(x) = f (g(x))

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 23 / 58

Page 40: Introduction to Functional Programming

Function Recap

Higher-order Functions

Functions can take functions as input and/or returnfunctions as the result.

h(p, q, x) = p(x) + q(2)

h(f , g , 3) = f (3) + g(2)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 24 / 58

Page 41: Introduction to Functional Programming

Function Recap

Higher-order Functions

Functions can take functions as input and/or returnfunctions as the result.

h(p, q, x) = p(x) + q(2)h(f , g , 3) = f (3) + g(2)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 24 / 58

Page 42: Introduction to Functional Programming

Function Recap

Higher-order Functions

The derivative of cos(x) returns another function.

ddx cos(x) = − sin(x)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 25 / 58

Page 43: Introduction to Functional Programming

Function Recap

A functional program consists entirely of functions

def main(args):

result = do_something_with_args(args)

print result

def do_something_with_args(args):

return ’-’.join(args[1:])

./justfunctions.py hello functional programming

hello-functional-programming

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 26 / 58

Page 44: Introduction to Functional Programming

Function Recap

A functional program consists entirely of functions

main :: IO()

main = do

args <- getArgs

let result = do_something_with_args args

putStrLn result

do_something_with_args :: [String] -> String

do_something_with_args args = intercalate "-" args

./justfunctions hello functional programming

hello-functional-programming

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 27 / 58

Page 45: Introduction to Functional Programming

Common FP Idioms

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 28 / 58

Page 46: Introduction to Functional Programming

Common FP Idioms Recursion

Recursive function: Haskell

doubleAll :: Num a => [a] -> [a]

doubleAll [] = []

doubleAll (x:xs) = x*2 : doubleAll xs

Example use in the interactive interpreter:

Prelude Main> doubleAll [8,2,3]

[16,4,6]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 29 / 58

Page 47: Introduction to Functional Programming

Common FP Idioms Recursion

Recursive function: Python

def doubleAll(numbers):

if numbers == []:

return []

else:

first = numbers[0]

rest = numbers[1:]

return [first * 2] + doubleAll(rest)

Example use in the interactive interpreter:

>>> doubleAll([8,2,3])

[16, 4, 6]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 30 / 58

Page 48: Introduction to Functional Programming

Common FP Idioms Recursion

An iterative version in Python

def doubleAll(numbers):

doubled = []

for num in numbers:

doubled.append(num * 2)

return doubled

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 31 / 58

Page 49: Introduction to Functional Programming

Common FP Idioms Pattern Matching

Pattern Matching: Haskell

doubleAll :: Num a => [a] -> [a]

doubleAll [] = []

doubleAll (x:xs) = x*2 : doubleAll xs

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 32 / 58

Page 50: Introduction to Functional Programming

Common FP Idioms Higher-order Functions

Higher-order functions: Python

f (x) = 2x + 3g(x) = f (x) + 1h(p, q, x) = p(x) + q(2)

def f(x):

return (2*x) + 3

def g(x):

return f(x) + 1

def h(func_a, func_b, x):

return func_a(x) + func_b(2)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 33 / 58

Page 51: Introduction to Functional Programming

Common FP Idioms Higher-order Functions

Higher-order functions: Haskell

f (x) = 2x + 3g(x) = f (x) + 1h(p, q, x) = p(x) + q(2)

f x = (2*x) + 3

g x = (f x) + 1

h :: (Int->Int) -> (Int->Int) -> Int -> Int

h func_a func_b x = (func_a x) + (func_b 2)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 34 / 58

Page 52: Introduction to Functional Programming

Higher-order Functions and Lists

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 35 / 58

Page 53: Introduction to Functional Programming

Higher-order Functions and Lists

3 Basic List Operations

Map Convert each element of a list into some other value.Example: Convert a list of students to a list of exam scores.

Filter Get a subset of a list based on some condition. Example:Filter the entire list of students down to only those thatpassed the exam.

Fold Reduce a list of items to a single value. Example: Reducethe list of students to a single string of all names.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 36 / 58

Page 54: Introduction to Functional Programming

Higher-order Functions and Lists

3 Basic List Operations

Map Convert each element of a list into some other value.Example: Convert a list of students to a list of exam scores.

Filter Get a subset of a list based on some condition. Example:Filter the entire list of students down to only those thatpassed the exam.

Fold Reduce a list of items to a single value. Example: Reducethe list of students to a single string of all names.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 36 / 58

Page 55: Introduction to Functional Programming

Higher-order Functions and Lists

3 Basic List Operations

Map Convert each element of a list into some other value.Example: Convert a list of students to a list of exam scores.

Filter Get a subset of a list based on some condition. Example:Filter the entire list of students down to only those thatpassed the exam.

Fold Reduce a list of items to a single value. Example: Reducethe list of students to a single string of all names.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 36 / 58

Page 56: Introduction to Functional Programming

Higher-order Functions and Lists

Map

doubleAll :: Num a => [a] -> [a]

doubleAll [] = []

doubleAll (x:xs) = x*2 : doubleAll xs

Looks very similar to the builtin map function:

map :: (a -> b) -> [a] -> [b]

map _ [] = []

map f (x:xs) = f x : map f xs

So our doubleAll can actually be simplified as:

doubleAll = map (*2)

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 37 / 58

Page 57: Introduction to Functional Programming

Higher-order Functions and Lists

Student Data

data Student = Student { firstName :: String

, lastName :: String

, finalExamScore :: Double}

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 38 / 58

Page 58: Introduction to Functional Programming

Higher-order Functions and Lists

Student Data

[Student {firstName="John",

lastName="Deer",

finalExamScore=60},

Student {firstName="Billy",

lastName="Bob",

finalExamScore=49.1},

Student {firstName="Jane",

lastName="Doe",

finalExamScore=89},

Student {firstName="Jack",

lastName="Johnson",

finalExamScore=29.3}]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 39 / 58

Page 59: Introduction to Functional Programming

Higher-order Functions and Lists

Map

Map type signature:

map :: (a -> b) -> [a] -> [b]

Map on student data:

allscores :: [Student] -> [Double]

allscores students = map finalExamScore students

finalExamScore type signature:

finalExamScore :: Student -> Double

Output:

Final Exam Scores: [60.0,49.1,89.0,29.3]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 40 / 58

Page 60: Introduction to Functional Programming

Higher-order Functions and Lists

Filter

Filter type signature:

filter :: (a -> Bool) -> [a] -> [a]

Filter on student data:

passed :: [Student] -> [Student]

passed students = filter has_passed students

has_passed :: Student -> Bool

has_passed student = finalExamScore student >= 60

Output:

Students that have passed:

[John Deer (60.0),Jane Doe (89.0)]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 41 / 58

Page 61: Introduction to Functional Programming

Higher-order Functions and Lists

Fold

Fold type signature:

foldl :: (a -> b -> a) -> a -> [b] -> a

Fold on student data:

namecat :: [Student] -> String

namecat students = foldl catfun "" students

catfun :: String -> Student -> String

catfun acc student = acc ++ (firstName student) ++ "\n"

Output:

"John\nBilly\nJane\nJack\n"

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 42 / 58

Page 62: Introduction to Functional Programming

Higher-order Functions and Lists

Shortened Map, Filter, Fold

allscores = map finalExamScore

passed = filter has_passed

has_passed student = finalExamScore student >= 60

namecat = foldl catfun ""

where catfun = (\acc student ->

acc ++ (firstName student) ++ "\n")

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 43 / 58

Page 63: Introduction to Functional Programming

Higher-order Functions and Lists

Imperative Filter Example

class Student:

def __init__(self, firstname, lastname, finalexamscore):

self.firstname = firstname

self.lastname = lastname

self.finalexamscore = finalexamscore

def has_passed(self):

return self.finalexamscore >= 60

def passed(students):

passed_students = []

for student in students:

if student.has_passed():

passed_students.append(student)

return passed_students

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 44 / 58

Page 64: Introduction to Functional Programming

Advantages of Functional Programming

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 45 / 58

Page 65: Introduction to Functional Programming

Advantages of Functional Programming

Perlisism #19

“ A language that doesn’t affect the way you think aboutprogramming, is not worth knowing. ”

— Alan Perlis[5]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 46 / 58

Page 66: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 67: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 68: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 69: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 70: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 71: Introduction to Functional Programming

Advantages of Functional Programming

Advantages of Functional Programming

Changes the way you think about programming and problem solving.

Improvements on the types of abstractions we can do with eg.higher-order functions.

Lock-free concurrency.

Improved ways of testing - QuickCheck.

More effective reasoning about code.

Declare possible Null values explicitly if you need them. GoodbyeNullPointerException (mostly).

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 47 / 58

Page 72: Introduction to Functional Programming

Disdvantages of Functional Programming

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 48 / 58

Page 73: Introduction to Functional Programming

Disdvantages of Functional Programming

Disadvantages of Functional Programming

Steep learning curve.

There are some very cryptic concepts.

Tools/IDE’s are not as advanced as the mainstream equivalents.

Order of execution may be difficult to reason about in a lazy language.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 49 / 58

Page 74: Introduction to Functional Programming

Disdvantages of Functional Programming

Disadvantages of Functional Programming

Steep learning curve.

There are some very cryptic concepts.

Tools/IDE’s are not as advanced as the mainstream equivalents.

Order of execution may be difficult to reason about in a lazy language.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 49 / 58

Page 75: Introduction to Functional Programming

Disdvantages of Functional Programming

Disadvantages of Functional Programming

Steep learning curve.

There are some very cryptic concepts.

Tools/IDE’s are not as advanced as the mainstream equivalents.

Order of execution may be difficult to reason about in a lazy language.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 49 / 58

Page 76: Introduction to Functional Programming

Disdvantages of Functional Programming

Disadvantages of Functional Programming

Steep learning curve.

There are some very cryptic concepts.

Tools/IDE’s are not as advanced as the mainstream equivalents.

Order of execution may be difficult to reason about in a lazy language.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 49 / 58

Page 77: Introduction to Functional Programming

Disdvantages of Functional Programming

Unfamiliar Territory

Functional Programming is unfamiliar territory for most.

“ If you want everything to be familiar you will never learnanything new. ”

— Rich Hickey, author of Clojure[6]

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 50 / 58

Page 78: Introduction to Functional Programming

Companies using Functional Programming

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 51 / 58

Page 79: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 80: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 81: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 82: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 83: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 84: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 85: Introduction to Functional Programming

Companies using Functional Programming

Companies In South Africa

Pattern Matched Technologies, Midrand Using Erlang for all systems, eg.processing high volumes of financial transactions.

Eldo Energy, Johannesburg Using Clojure for automated meter readingand intelligent monitoring of consumer energy.

Rheo Systems, Pretoria Using Clojure for supply chain integration.

Yuppiechef, Cape Town Using Clojure for their Warehouse ManagementSystem.

Effective Control Systems, Kyalami Using Erlang for printer management.

Mira Networks, Somerset West Using Erlang for billing administration andmobile development.

Amazon.com, Cape Town Using Scala in EC2.

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 52 / 58

Page 86: Introduction to Functional Programming

Where do we go from here?

Table of Contents

1 Introduction

2 Definition of Functional Programming

3 Function Recap

4 Common FP IdiomsRecursionPattern MatchingHigher-order Functions

5 Higher-order Functions and Lists

6 Advantages of Functional Programming

7 Disdvantages of Functional Programming

8 Companies using Functional Programming

9 Where do we go from here?

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 53 / 58

Page 87: Introduction to Functional Programming

Where do we go from here?

Lambda Luminaries – @lambdaluminaryLocal functional programming user group

We meet once a month, on the second Monday of the month.http://www.meetup.com/lambda-luminaries/

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 54 / 58

Page 88: Introduction to Functional Programming

Where do we go from here?

Online Courses

Functional Programming Principles in ScalaEPFL Universityhttps://www.coursera.org/course/progfun

School of HaskellFP Completehttps://www.fpcomplete.com/school

Programming LanguagesUniversity of Washingtonhttps://www.coursera.org/course/proglang

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 55 / 58

Page 89: Introduction to Functional Programming

Where do we go from here?

Books

Miran LipovacaLearn You a Haskell for Great Good!http://learnyouahaskell.com/

Fred HebertLearn You Some Erlang for Great Good!http://learnyousomeerlang.com/

Yaron Minski, Anil Madhavapeddy, Jason HickeyReal World OCamlhttps://realworldocaml.org/

Paul Chiusano, Runar BjarnasonFunctional Programming in Scalahttp://www.manning.com/bjarnason/

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 56 / 58

Page 90: Introduction to Functional Programming

Where do we go from here?

References I

John HughesWhy Functional Programming Mattershttp:

//www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

John CarmackFunctional Programming in C++http://www.altdevblogaday.com/2012/04/26/

functional-programming-in-c/

Edsger W. DijkstraGo To Statement Considered Harmfulhttp://www.u.arizona.edu/~rubinson/copyright_violations/

Go_To_Considered_Harmful.html

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 57 / 58

Page 91: Introduction to Functional Programming

Where do we go from here?

References II

Tweet by Michael Feathershttps://twitter.com/mfeathers/status/29581296216

Alan Jay Perlishttp://www.cs.yale.edu/quotes.html

Rich Hickeyhttp://www.infoq.com/presentations/Simple-Made-Easy

Andreas PauleyAn Introduction to Functional Programminghttps://github.com/apauley/fp_presentation

Andreas Pauley – @apauley (Pattern Matched TechnologiesLambda Luminaries @lambdaluminary)Functional Programming September 2, 2013 58 / 58