What makes up functional programming?
4 first class functions
4 immutable data
4 reducing
4 pipelining
4 recursing
4 currying
4 monads
Slide 7
Slide 7 text
What makes up functional programming?
4 first class functions
4 immutable data
4 reducing
4 pipelining
4 recursing
4 currying
4 monads
Slide 8
Slide 8 text
Side-effects
Slide 9
Slide 9 text
What is not functional
function?
Slide 10
Slide 10 text
Un-functional Function
var value = 0
func increment() {
value += 1
}
Slide 11
Slide 11 text
Un-functional Function
func increment() {
let center = NSNotificationCenter.defaultCenter()
let value = center.valueForKey("key") as? Int ?? 0
center.setValue(value + 1, forKey: "key")
}
Slide 12
Slide 12 text
Functional Function
func increment(value:Int) -> Int {
return value + 1
}
Slide 13
Slide 13 text
High Order Functions
Slide 14
Slide 14 text
High Order Functions
4 Functions that take other functions as arguments
4 Functions that returns a functions
func message1(value:String) {
println(“Hello \(value)”)
}
var message2:(String -> ()) = { value in
println(“Hi \(value)”)
}
Slide 33
Slide 33 text
func message1(value:String) {
println(“Hello \(value)”)
}
var message2:(String -> Void) = { value in
println(“Hi \(value)”)
}
message2 = message1
message2(“dotSwift”)
// Hello dotSwift
Slide 34
Slide 34 text
Functional programming by Example
Slide 35
Slide 35 text
let groups = [
["Kyle", "Maxine"],
["André", "Katie", "Ash"]
]
Slide 36
Slide 36 text
How many people are in
each group?
Slide 37
Slide 37 text
How many people are in each group?
let groups = [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
var count = [Int]()
for group in groups {
let people = countElements(group)
count.append(people)
}
count
// [2, 3]
Slide 38
Slide 38 text
map
Slide 39
Slide 39 text
map
(source, transform) -> ([T])
Slide 40
Slide 40 text
transform
(item) -> (T)
Slide 41
Slide 41 text
How many people are in each group?
let groups = [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
map(groups) {
countElements($0)
}
// [2, 3]
Slide 42
Slide 42 text
countElements
(sequence) -> (Int)
Slide 43
Slide 43 text
transform
(item) -> (T)
Slide 44
Slide 44 text
(item) -> (T)
(sequence) -> (Int)
Slide 45
Slide 45 text
How many people are in each group?
let groups = [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
map(groups, countElements)
// [2, 3]
Slide 46
Slide 46 text
Order the numbers of
people in each group
Slide 47
Slide 47 text
[2, 3] -> [3, 2]
Slide 48
Slide 48 text
sorted
Slide 49
Slide 49 text
sorted
(sequence, isOrderedBefore) -> (sequence)
Slide 50
Slide 50 text
isOrderedBefore
(lhs, rhs) -> (Bool)
Slide 51
Slide 51 text
Order the numbers of people in each group
let count = [2, 3]
Slide 52
Slide 52 text
Order the numbers of people in each group
let count = [2, 3]
sorted(count) { (lhs, rhs) in
lhs > rhs
}
// largest group is [3, 2].first
Slide 53
Slide 53 text
Operators are closures
Slide 54
Slide 54 text
>
(lhs, rhs) -> (Bool)
Slide 55
Slide 55 text
let count = [2, 3]
sorted(count, >)
// largest group is [3, 2].first
Slide 56
Slide 56 text
Building an array of all people
Slide 57
Slide 57 text
Building an array of all people
let groups = [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
var people = [String]()
for group in groups {
people += group
}
// ["Kyle", "Maxine", "André", "Katie", "Ash"]
Slide 58
Slide 58 text
reduce
Slide 59
Slide 59 text
reduce
(sequence, initial(U), combine) -> (U)
Slide 60
Slide 60 text
combine
(U, value) -> (U)
Slide 61
Slide 61 text
+
(U, U) -> (U)
Slide 62
Slide 62 text
reduce(groups, [], +)
Slide 63
Slide 63 text
Building an array of all people
let groups = [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
reduce(groups, [], +)
// ["Kyle", "Maxine", "André", "Katie", "Ash"]
Slide 64
Slide 64 text
let input = "Kyle,Maxine\nAndré,Katie,Ash"
Slide 65
Slide 65 text
let input = "Kyle,Maxine\nAndré,Katie,Ash"
var groups = [[String]]()
for line in input.componentsSeparatedByString("\n") {
let group = line.componentsSeparatedByString(",")
groups.append(group)
}
groups
// [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]
Slide 66
Slide 66 text
let input = "Kyle,Maxine\nAndré,Katie,Ash"
let groups = map(input.componentsSeparatedByString("\n")) { line in
line.componentsSeparatedByString(",")
}
groups
// [["Kyle", "Maxine"], ["André", "Katie", "Ash"]]