Functional Programming!
Dev Sesh #3
What?
Passing around functions
Why
Loops
Key
Javascript
Java
Swift
Python
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))
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]
Map: imperative programming
For each - map - filter - any, some, every - reduce, fold
Returns a list of String descriptions of each student
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)")
}
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());
Filter: imperative programming
For each - map - filter - any, some, every - reduce, fold
Store an array of goodKids who have passing grades
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)
}
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})
For each - map - filter - any, some, every - reduce, fold
Any, some, every
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
}
}
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})
For each - map - filter - any, some, every - reduce, fold
Reduce, fold: imperative programming
Return total score of all students
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
}
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})