1 of 19

Functional Programming!

Dev Sesh #3

2 of 19

What?

Passing around functions

3 of 19

Why

  • Loops (but cleaner)
  • Asynchronous calls
  • Intention is clear

4 of 19

Loops

  • For each/Map
  • Filter
  • Any, some, every
  • Reduce/fold…?

5 of 19

Key

Javascript

Java

Swift

Python

6 of 19

For each: imperative programming

For each - map - filter - any, some, every - reduce, fold

const students = [

{name: "David", grade: 99},

{name: "Evan", grade: 100},

{name: "Yall", grade: 50}

];

for (const stud of students) {

console.log(`${stud.name} has this grade: ${stud.grade}`);

}

let students = [(name: "David", grade: 99), (name: "Evan", grade: 100), (name: "Yall", grade: 50)]

for stud in students {

print("\(stud.name) has this grade: \(stud.grade)")

}

class Student {String name; int grade; Student(String name, int grade) {this.name = name; this.grade = grade;}}

Student[] students = new Student[]{new Student("David", 99), new Student("Evan", 100), new Student("Yall", 50)};

for (Student stud : students)

System.out.println(stud.name + " has this grade: " + stud.grade);

students = [("David", 99), ("Evan", 100), ("Yall", 50)]

for stud in students:

(name, grade) = stud

print(name + " has this grade: " + str(grade))

7 of 19

For each: functional programming

For each - map - filter - any, some, every - reduce, fold

students.forEach(stud => console.log(`${stud.name} has this grade: ${stud.grade}`));

students.forEach({print("\($0.name) has this grade: \($0.grade)")})

Arrays.stream(students).forEach(stud -> System.out.println(stud.name + " has this grade: " + stud.grade));

[print(name + " has this grade: " + str(grade))

for (name, grade) in students]

8 of 19

Map: imperative programming

For each - map - filter - any, some, every - reduce, fold

Returns a list of String descriptions of each student

9 of 19

Map: imperative programming

For each - map - filter - any, some, every - reduce, fold

const toString = [];

for (const stud of students) {

toString.push(`${stud.name} has this grade: ${stud.grade}`);

}

toString = []

for (name, grade) in students:

toString.append(name + " has this grade: " + str(grade))

List<String> toString = new ArrayList<>();

for (Student stud : students)

toString.add(stud.name + " has this grade: " + stud.grade);

var toString = [String]()

for stud in students {

toString.append("\(stud.name) has this grade: \(stud.grade)")

}

10 of 19

Map: functional programming

For each - map - filter - any, some, every - reduce, fold

const toString = students.map(stud => `${stud.name} has this grade: ${stud.grade}`);

toString = map(lambda stud:

stud[0] + " has this grade: " + str(stud[1]), students)

let toString = students.map({"\($0.name) has this grade: \($0.grade)"})

List<String> toString = Arrays.stream(students)

.map(stud -> stud.name + " has this grade: " + stud.grade)

.collect(Collectors.toList());

11 of 19

Filter: imperative programming

For each - map - filter - any, some, every - reduce, fold

Store an array of goodKids who have passing grades

12 of 19

Filter: imperative programming

For each - map - filter - any, some, every - reduce, fold

const goodKids = [];

for (const stud of students)

if (stud.grade > 60)

goodKids.push(stud);

goodKids = []

for (name, grade) in students:

if grade > 60:

goodKids.append((name, grade))

List<Student> goodKids = new ArrayList<>();

for (Student stud : students)

if (stud.grade > 60)

goodKids.add(stud);

var goodKids = [String]()

for stud in students where stud.grade > 60 {

goodKids.append(stud)

}

13 of 19

Filter: functional programming

For each - map - filter - any, some, every - reduce, fold

const goodKids = students.filter(stud => stud.grade > 60);

goodKids = filter(lambda stud: stud[1] > 60, students)

List<Student> goodKids = Arrays.stream(students)

.filter(stud -> stud.grade > 60)

.collect(Collectors.toList());

let goodKids = students.filter({

$0.grade > 60})

14 of 19

For each - map - filter - any, some, every - reduce, fold

Any, some, every

  1. Return whether David is in the class
  2. Returns whether or not everyone passes

15 of 19

For each - map - filter - any, some, every - reduce, fold

Any, some, every: imperative programming

let isDavidHere = false;

let everyonePasses = true;

for (const stud of students) {

if (stud.name === "David")

isDavidHere = true;

if (stud.grade <= 60)

everyonePasses = false;

}

isDavidHere = False

everyonePasses = True

for (name, grade) in students:

if name == "David":

isDavidHere = True

if grade <= 60:

everyonePasses = False

boolean isDavidHere = false;

boolean everyonePasses = true;

for (Student stud : students) {

if (stud.name.equals("David"))

isDavidHere = true;

if (stud.grade <= 60)

everyonePasses = false;

}

var isDavidHere = false

var everyonePasses = true

for stud in students {

if (stud.name == "David") {

isDavidHere = true

}

if (stud.grade <= 60) {

everyonePasses = false

}

}

16 of 19

For each - map - filter - any, some, every - reduce, fold

Any, some, every: functional programming

const isDavidHere = students.some(stud =>

stud.name === "David");

const everyonePasses = students.every(stud =>

stud.grade > 60);

isDavidHere = any(stud[0] == "David" for stud in students)

everyonePasses = all(stud[1] <= 60 for stud in students)

boolean isDavidHere = Arrays.stream(students).anyMatch(stud -> stud.name.equals("David"));

boolean everyonePasses = Arrays.stream(students).allMatch(stud -> stud.grade <= 60);

let isDavidHere = students.contains(where: {$0.name == "David"})

let everyonesPasses = student.allSatisfy({$0.grade <= 60})

17 of 19

For each - map - filter - any, some, every - reduce, fold

Reduce, fold: imperative programming

Return total score of all students

18 of 19

For each - map - filter - any, some, every - reduce, fold

Reduce, fold: imperative programming

let totalScore = 0;

for (const stud of students)

totalScore += stud.grade;

totalScore = 0

for (name, grade) in students:

totalScore += grade

int totalScore = 0;

for (Student stud : students)

totalScore += stud.grade;

var totalScore = 0

for stud in students {

totalScore += stud.grade

}

19 of 19

For each - map - filter - any, some, every - reduce, fold

Reduce, fold: functional programming

const totalScore = students.reduce((sum, stud) =>

sum + stud.grade, 0);

from functools import reduce

totalScore = reduce(lambda sum, stud: sum + stud[1], students)

#or

totalScore = sum(map(lambda stud: stud[1], students))

int totalScore = Arrays.stream(students).reduce(0, ((sum, s2) -> sum + s2.grade), null);

int totalScore = Arrays.stream(students)

.mapToInt(s -> s.grade).sum();

let totalScore = students

.map({$0.grade}).reduce(0,+)

//or

let totalScore = students

.reduce(0, {$0 + $1.grade})