Functional Programming
“ 们 ”

FP 可 

Swift 们 

FP 们 OC ReactiveCocoa 能
Functional Programming
in
“ 们 ”

FP 可 

Swift 们 

FP 们 OC ReactiveCocoa 能
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
•
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
•
•
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
•
•
•
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
•
•
•
FP

SICP 最

- 分 很 ⼦子

- 上 

- 上 是
.
很 lambda 个 去 . 想
.
λ
很 lambda 个 去 . 想
λ x . x
lambda 

lambda λ ⼤大 有 

lambda
λ x . x
{ x in x }
lambda 

lambda λ ⼤大 有 

lambda
λ x . x
{ x in x }
λ x . (λ y . xy)
lambda 

lambda λ ⼤大 有 

lambda
(λ x . x)n
起 ⽣生
(λ x . x)n
{ x in x }(n)
起 ⽣生
λ
lambda 

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要
λ
lambda 

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要
( )
λ
lambda 

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要
… The ways in which one can divide up the
original problem depend directly on the ways in
which one can glue solutions together. Therefore,
to increase one’s ability to modularize a problem
conceptually, one must provide new kinds of glue
in the programming language.
— “Why Functional Programming Matters”
想 

不 “Why Functional Programming Matters” 最 ⾃自 想 上 

FP 是 ?
么
•


么
•
•


么
看 上 来 就来 ⼀一 

得
NSArray *xs = @[@"a", @"b", @"c", @“d"];


看 上 来 就来 ⼀一 

得
// [“A”, "B", "C", “D"];
NSArray *xs = @[@"a", @"b", @"c", @“d"];


看 上 来 就来 ⼀一 

得
NSMutableArray *ys = [NSMutableArray array];
for (NSUInteger i = 0; i < xs.count; i++) {
NSString *y = upcase(xs[i]);
[ys addObject:y];
}
// [“A”, "B", "C", “D"];
NSArray *xs = @[@"a", @"b", @"c", @“d"];


看 上 来 就来 ⼀一 

得
NSMutableArray *ys = [NSMutableArray array];
for (NSUInteger i = 0; i < xs.count; i++) {
NSString *y = upcase(xs[i]);
[ys addObject:y];
}
// [“A”, "B", "C", “D"];
NSArray *xs = @[@"a", @"b", @"c", @“d"];


看 上 来 就来 ⼀一 

得
map(xs, upcase)
Swift 来 map 

upcase
map(xs, upcase)
// [“A”, "B", "C", “D"];
Swift 来 map 

upcase
! "
map
为 天 过

map 6 为 6 天 过
#################
!!!!!! """"""
! "
map
为 天 过

map 6 为 6 天 过
! $
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
! $
! %f
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
! $
! %f
% $g
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
! $
! %f
% $g
f g
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
! $
! %f
% $g
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
! $
! %f
% $g
h
为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上
let h = compose(g, f)
compose f g h

⼤大 得
let h = compose(g, f)
let h = g • f
compose f g h

⼤大 得
(a • b • c • d)(x)
上
(a • b • c • d)(x)
a(b(c(d(x))))
上
我 到 也
79927398713
79927398713
31789372997
79927398713
3178937299731789372997
79927398713
3178937299731789372997
3271696749187
79927398713
3178937299731789372997
3271696749187
32779674997
79927398713
3178937299731789372997
3271696749187
32779674997
3+2+7+7+9+6+7+4+9+9+7=70
79927398713
3178937299731789372997
3271696749187
32779674997
3+2+7+7+9+6+7+4+9+9+7=70
70 % 10 == 0
func toDigits(num: Int) -> [Int] {
return map(String(num)) {
String($0).toInt()!
}
}
func toDigits(num: Int) -> [Int] {
return map(String(num)) {
String($0).toInt()!
}
}
toDigits(1234) // [1, 2, 3, 4]
reverse([1, 2, 3, 4]) // [4, 3, 2, 1]
func doubleSecond(nums: [Int]) -> [Int] {
return map(enumerate(nums)) { i, x in
i % 2 == 0 ? x : x * 2
}
}
时 2
func doubleSecond(nums: [Int]) -> [Int] {
return map(enumerate(nums)) { i, x in
i % 2 == 0 ? x : x * 2
}
}
doubleSecond([1, 2, 3, 4]) // [1, 4, 3, 8]
时 2
func sumDigits(nums: [Int]) -> Int {
return sum(reduce(nums, []) {
$0 + toDigits($1)
})
}
sumDigits([1, 12, 3]) // 7
func isValid(num: Int) -> Bool {
return num % 10 == 0
}
func isValid(num: Int) -> Bool {
return num % 10 == 0
}
isValid(12) // false
let validator = isValid
• sumDigits
• doubleSecond
• reverse
• toDigits
let validator = isValid
• sumDigits
• doubleSecond
• reverse
• toDigits
validator(4716347184862961) // true
func validator(ccnum: String) -> Bool {
var sum = 0
var idx = 0
for char in reverse(ccnum) {
if let digit = String(char).toInt() {
if (++idx)%2 == 0 {
sum += digit < 5
? digit * 2
: digit * 2 - 9
}
else {
sum += digit
}
}
}
return sum % 10 == 0
}
⼈人 在
infix operator |> {
associativity left precedence 150
}
func |> <T,U> (lhs:T, rhs:T -> U ) -> U {
return rhs(lhs)
}
⼤大 得 想 Unix 多
4716347184862961 |> toDigits
• • • • • • • • • • • • • • • • • • • • • • • • • •
|> reverse
• • • • • • • • •
|> doubleSecond
• • • • • • • • • • • • • •
|> sumDigits
• • • • • • • • • • •
|> isValid
• • • • • • • • •
// true
HλPPY HλCKING
- 起 下 来 

- Functor , Applicative, Monad Swift 们 可 

- ReactiveCocoa 可 

- 了

Swift Functional Programming