What makes up functional programming?
4 first class functions
4 immutable data
4 reducing
4 pipelining
4 recursing
4 currying
4 monads
Slide 25
Slide 25 text
What makes up functional programming?
4 first class functions
4 immutable data
4 reducing
4 pipelining
4 recursing
4 currying
4 monads
Slide 26
Slide 26 text
Side-effects
Slide 27
Slide 27 text
What is not functional
function?
Slide 28
Slide 28 text
Un-functional Function
var value = 0
func increment() {
value += 1
}
Slide 29
Slide 29 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 30
Slide 30 text
Functional Function
func increment(value:Int) -> Int {
return value + 1
}
Slide 31
Slide 31 text
High Order Functions
Slide 32
Slide 32 text
High Order Functions
4 Functions that take other functions as arguments
Slide 33
Slide 33 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 52
Slide 52 text
func message1(value:String) {
println(“Hello \(value)”)
}
var message2:(String -> Void) = { value in
println(“Hi \(value)”)
}
message2 = message1
message2(“AltConf”)
// Hello AltConf
Slide 53
Slide 53 text
Functional programming by Example
Slide 54
Slide 54 text
let groups = [
["Kyle", "Katie"],
["André", "Maxine", "Ash"]
]
Slide 55
Slide 55 text
How many people are in
each group?
Slide 56
Slide 56 text
How many people are in each group?
let groups = [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
var counts = [Int]()
for group in groups {
let people = count(group)
counts.append(people)
}
counts
// [2, 3]
Slide 57
Slide 57 text
map
Slide 58
Slide 58 text
map
(source, transform) -> ([T])
Slide 59
Slide 59 text
transform
(item) -> (T)
Slide 60
Slide 60 text
How many people are in each group?
let groups = [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
map(groups) {
count($0)
}
// [2, 3]
Slide 61
Slide 61 text
count
(sequence) -> (Int)
Slide 62
Slide 62 text
transform
(item) -> (T)
Slide 63
Slide 63 text
(item) -> (T)
(sequence) -> (Int)
Slide 64
Slide 64 text
How many people are in each group?
let groups = [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
map(groups, count)
// [2, 3]
Slide 65
Slide 65 text
Order the numbers of
people in each group
Slide 66
Slide 66 text
[2, 3] -> [3, 2]
Slide 67
Slide 67 text
sorted
Slide 68
Slide 68 text
sorted
(sequence, isOrderedBefore) -> (sequence)
Slide 69
Slide 69 text
isOrderedBefore
(lhs, rhs) -> (Bool)
Slide 70
Slide 70 text
Order the numbers of people in each group
let count = [2, 3]
Slide 71
Slide 71 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 72
Slide 72 text
Operators are closures
Slide 73
Slide 73 text
>
(lhs, rhs) -> (Bool)
Slide 74
Slide 74 text
let count = [2, 3]
sorted(count, >)
// largest group is [3, 2].first
Slide 75
Slide 75 text
Building an array of all people
Slide 76
Slide 76 text
Building an array of all people
let groups = [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
var people = [String]()
for group in groups {
people += group
}
// ["Kyle", "Katie", "André", "Maxine", "Ash"]
Slide 77
Slide 77 text
reduce
Slide 78
Slide 78 text
reduce
(sequence, initial(U), combine) -> (U)
Slide 79
Slide 79 text
combine
(U, value) -> (U)
Slide 80
Slide 80 text
+
(U, U) -> (U)
Slide 81
Slide 81 text
reduce(groups, [], +)
Slide 82
Slide 82 text
Building an array of all people
let groups = [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
reduce(groups, [], +)
// ["Kyle", "Katie", "André", "Maxine", "Ash"]
Slide 83
Slide 83 text
let input = "Kyle,Katie\nAndré,Maxine,Ash"
Slide 84
Slide 84 text
let input = "Kyle,Katie\nAndré,Maxine,Ash"
var groups = [[String]]()
for line in input.componentsSeparatedByString("\n") {
let group = line.componentsSeparatedByString(",")
groups.append(group)
}
groups
// [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
Slide 85
Slide 85 text
let input = "Kyle,Katie\nAndré,Maxine,Ash"
let groups = map(input.componentsSeparatedByString("\n")) { line in
line.componentsSeparatedByString(",")
}
groups
// [["Kyle", "Katie"], ["André", "Maxine", "Ash"]]
Conclusion
4 DSLs can be used to reduce bugs and build simpler
generic declaritive languages
4 We’ve seen how Functional Programming can be used
to build declarative code
4 We’ve seen how declarative code helps simplicity,
testability and on boarding new developers