Top Banner
Functional Programming An Introduction 2015.05.21 1
43
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional Programming: An Introduction

Functional ProgrammingAn Introduction

2015.05.21

1

Page 2: Functional Programming: An Introduction

> Drew Olson > Braintree > github.com/drewolson

2

Page 3: Functional Programming: An Introduction

Things to know

> Ask questions > node > babeljs.io

3

Page 4: Functional Programming: An Introduction

Reduce/Map/Filter in Javascript

4

Without State

Without Mutation

Page 5: Functional Programming: An Introduction

What is functional programming?

5

Page 6: Functional Programming: An Introduction

What are we going to focus on?

> Immutability > No state > Higher-order functions > Lots of code

6

Page 7: Functional Programming: An Introduction

What aren’t we going to focus on?

> Types > Monads > Being tricky to feel smart

7

Page 8: Functional Programming: An Introduction

Why even care?

> Explicitness > Concurrency / Parallelism > Understandability

8

Page 9: Functional Programming: An Introduction

Reduce/Map/Filter in Javascript

9

Without State

> Without Mutation

Page 10: Functional Programming: An Introduction

10

let a = 1;a = 2;

console.log(a);// => 2// :(

Page 11: Functional Programming: An Introduction

11

let a = 1;a = 2;

console.log(a);// => 2// :(

Enforced via discipline :)

Page 12: Functional Programming: An Introduction

Reduce/Map/Filter in Javascript

12

> Without State

Without Mutation

Page 13: Functional Programming: An Introduction

13

class Foo  attr_accessor :bar

  def initialize(bar)    @bar = bar  end

  def increment(i)    i + 1  endend

foo = Foo.new(1)

# things happen here# .# ..# ...

# what does this return?p foo.bar

# what does this return?p foo.increment(2)

Page 14: Functional Programming: An Introduction

Let’s add some numbers!

14

Page 15: Functional Programming: An Introduction

15

let sumIter = function (n) {  let sum = 0;

  for (let i = 0; i <= n; i++) {    sum = sum + i;  }

  return sum;}

console.log(sumIter(50));// => 1275

Page 16: Functional Programming: An Introduction

16

let sumIter = function (n) {  let sum = 0;

  for (let i = 0; i <= n; i++) {    sum = sum + i;  }

  return sum;}

console.log(sumIter(50));// => 1275

Page 17: Functional Programming: An Introduction

Recursion!

> Base case > Recursive call

17

Page 18: Functional Programming: An Introduction

18

let sumRec = function (n) {  if (n === 0) {    return 0;  } else {    return n + sumRec(n - 1);  }}

console.log(sumRec(50));// => 1275

Page 19: Functional Programming: An Introduction

19

let sumRec = function (n) {  if (n === 0) {    return 0;  } else {    return n + sumRec(n - 1);  }}

console.log(sumRec(50000000));// => RangeError: Maximum call stack size exceeded

Page 20: Functional Programming: An Introduction

20

// sumRec(5)// 1 + sumRec(4)// 1 + (1 + sumRec(3))// 1 + (1 + (1 + sumRec(2)))// 1 + (1 + (1 + (1 + sumRec(1))))// 1 + (1 + (1 + (1 + (1 + sumRec(0)))))// 1 + (1 + (1 + (1 + (1 + 0))))// 1 + (1 + (1 + (1 + 1)))// 1 + (1 + (1 + 2))// 1 + (1 + 3)// 1 + 4// 5

Page 21: Functional Programming: An Introduction

21

let sumTail = function (n, acc=0) {  if (n === 0) {    return acc;  } else {    return sumTail(n - 1, acc + n);  }}

console.log(sumTail(50000000));// => 1250000025000000

Page 22: Functional Programming: An Introduction

22

// sumTail(5)// sumTail(5, 0)// sumTail(4, 1)// sumTail(3, 2)// sumTail(2, 3)// sumTail(1, 4)// sumTail(0, 5)// 5

Page 23: Functional Programming: An Introduction

> Reduce/Map/Filter in Javascript

23

Without State

Without Mutation

Page 24: Functional Programming: An Introduction

Higher-order functions!

> Functions as values > Take functions as input > Return functions

24

Page 25: Functional Programming: An Introduction

25

Page 26: Functional Programming: An Introduction

Higher-order functions!

YOU KNOW THIS!!

26

Page 27: Functional Programming: An Introduction

27

File.open("/tmp/setec_astronomy", "w") do |f|  # do stuff with fend

[1, 2, 3].map do |i|  i + 1end

# => [2, 3, 4]

Page 28: Functional Programming: An Introduction

28

// take a function as an argument

let callMeMaybe = function (f) {  if (Math.random() < 0.5) {    return f();  } else {    return undefined;  }}

for (var i of [1, 2, 3, 4, 5]) {  console.log(`Try ${i}`);

  callMeMaybe(function () {    console.log("I GOT CALLED!");  });}

Page 29: Functional Programming: An Introduction

29

Try 1 I GOT CALLED!Try 2 Try 3 I GOT CALLED!Try 4 I GOT CALLED!Try 5

Page 30: Functional Programming: An Introduction

30

// return a function

let incrementor = function (n) {  return function (i) {    return i + n;  }}

let add1 = incrementor(1);console.log(add1(2));// => 3

Page 31: Functional Programming: An Introduction

OK! Let’s implement reduce!

> Tail recursion > Higher-order functions > No state > No mutation

31

Page 32: Functional Programming: An Introduction

32

let coll = [1, 2, 3, 4, 5];

let result = reduce(coll, 0, function (i, sum) {  return sum + i;});

console.log(result);// => 15

Page 33: Functional Programming: An Introduction

33

let reduce = function (coll, acc, fn) {  if (coll.length === 0) {    return acc;  }

  let head = coll[0];  let rest = coll.slice(1, coll.length);

  let newAcc = fn(head, acc);

  return reduce(rest, newAcc, fn);}

Page 34: Functional Programming: An Introduction

OK! Let’s implement map!

> ONLY USING REDUCE!!?!??!

34

Page 35: Functional Programming: An Introduction

35

let coll = [1, 2, 3, 4, 5];

let result = map(coll, function (i) {  return i + 1;});

console.log(result);// => [2, 3, 4, 5, 6]

Page 36: Functional Programming: An Introduction

36

let map = function (coll, fn) {  return reduce(coll, [], function (i, acc) {    return acc.concat(fn(i));  });}

Page 37: Functional Programming: An Introduction

OK! Let’s implement filter!

> ONLY USING REDUCE!!?!??! > This time less shockingly revealed!!

37

Page 38: Functional Programming: An Introduction

38

let coll = [1, 2, 3, 4, 5];

let result = filter(coll, function (i) {  return i < 4;});

console.log(result);// => [1, 2, 3]

Page 39: Functional Programming: An Introduction

39

let filter = function (coll, fn) {  return reduce(coll, [], function (i, acc) {    if (fn(i)) {      return acc.concat(i);    } else {      return acc;    }  });}

Page 40: Functional Programming: An Introduction

Reduce/Map/Filter in Javascript

40

Without State

Without Mutation

Page 41: Functional Programming: An Introduction

41

Page 42: Functional Programming: An Introduction

Things to check out

> Functional Javascript (book) > The Little Schemer (book) > Elixir (language)

42

Page 43: Functional Programming: An Introduction

braintreepayments.com

End Slide_

43

Thanks! Questions?