swift functional programming

63
Functional Programming F-^]ŏ·Ü们÷w*]ŕk0F8Ņóu FP /Ĕd可à ?ļ.9 Swift 们× FP iK们÷ıÜŕ%0ouÆ 9«`Ûñ)ŕOC ReactiveCocoa ō能ļ.

Upload: -

Post on 28-Jul-2015

96 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Swift Functional Programming

Functional Programming

“ 们 ”

FP 可

Swift 们

FP 们 OC ReactiveCocoa 能

Page 2: Swift Functional Programming

Functional Programmingin

“ 们 ”

FP 可

Swift 们

FP 们 OC ReactiveCocoa 能

Page 3: Swift Functional Programming

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 4: Swift Functional Programming

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 5: Swift Functional Programming

• &��� �

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 6: Swift Functional Programming

• &��� �• (����)��

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 7: Swift Functional Programming

• &��� �• (����)��• $#����

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 8: Swift Functional Programming

• &��� �• (����)��• $#����

0�

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

Page 9: Swift Functional Programming

'.+ . 1"

很 lambda 个 去 . 想

Page 10: Swift Functional Programming

'.+ . 1"

λ

很 lambda 个 去 . 想

Page 11: Swift Functional Programming

λ x . x

lambda

lambda λ ⼤大 有

lambda

Page 12: Swift Functional Programming

λ x . x

{ x in x }

lambda

lambda λ ⼤大 有

lambda

Page 13: Swift Functional Programming

λ x . x

{ x in x }

λ x . (λ y . xy)

lambda

lambda λ ⼤大 有

lambda

Page 14: Swift Functional Programming

(λ x . x)n

起 ⽣生

Page 15: Swift Functional Programming

(λ x . x)n

{ x in x }(n)

起 ⽣生

Page 16: Swift Functional Programming

λ

lambda

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要

Page 17: Swift Functional Programming

�� ���%

λ

lambda

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要

Page 18: Swift Functional Programming

��/!�� (��*��)

�� ���%

λ

lambda

( 这 你 起 下 来 )

最 说 说 的 们 分 ⼦子

们 的 来 要

Page 19: Swift Functional Programming

… 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 是 ?

Page 20: Swift Functional Programming

-0�

Page 21: Swift Functional Programming

-0�

• ��0�����

Page 22: Swift Functional Programming

-0�

• ��0�����

• �0���,�!

Page 23: Swift Functional Programming

看 上 来 就来 ⼀一

Page 24: Swift Functional Programming

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

看 上 来 就来 ⼀一

Page 25: Swift Functional Programming

// [“A”, "B", "C", “D"];

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

看 上 来 就来 ⼀一

Page 26: Swift Functional Programming

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"];

看 上 来 就来 ⼀一

Page 27: Swift Functional Programming

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"];

看 上 来 就来 ⼀一

Page 28: Swift Functional Programming

map(xs, upcase)

Swift 来 map

upcase

Page 29: Swift Functional Programming

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

Swift 来 map

upcase

Page 30: Swift Functional Programming

! "

map

为 天 过

map 6 为 6 天 过

Page 31: Swift Functional Programming

#################!!!!!! """"""

! "

map

为 天 过

map 6 为 6 天 过

Page 32: Swift Functional Programming

! $

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 33: Swift Functional Programming

! $

! %f

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 34: Swift Functional Programming

! $

! %f

% $g

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 35: Swift Functional Programming

! $

! %f

% $g

f g

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 36: Swift Functional Programming

! $

! %f

% $g

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 37: Swift Functional Programming

! $

! %f

% $g

h

为 没

为 还 f 还 没 g

为 f g

会 f g 上 是 h

h得 上

Page 38: Swift Functional Programming

let h = compose(g, f)

compose f g h

⼤大 得

Page 39: Swift Functional Programming

let h = compose(g, f)

let h = g • f

compose f g h

⼤大 得

Page 40: Swift Functional Programming

(a • b • c • d)(x)

Page 41: Swift Functional Programming

(a • b • c • d)(x)

a(b(c(d(x))))

Page 42: Swift Functional Programming

我 到 也

Page 43: Swift Functional Programming

79927398713

Page 44: Swift Functional Programming

7992739871331789372997

Page 45: Swift Functional Programming

799273987133178937299731789372997

Page 46: Swift Functional Programming

799273987133178937299731789372997

3271696749187

Page 47: Swift Functional Programming

799273987133178937299731789372997

327169674918732779674997

Page 48: Swift Functional Programming

799273987133178937299731789372997

327169674918732779674997

3+2+7+7+9+6+7+4+9+9+7=70

Page 49: Swift Functional Programming

799273987133178937299731789372997

327169674918732779674997

3+2+7+7+9+6+7+4+9+9+7=7070 % 10 == 0

Page 50: Swift Functional Programming

func toDigits(num: Int) -> [Int] { return map(String(num)) { String($0).toInt()! } }

Page 51: Swift Functional Programming

func toDigits(num: Int) -> [Int] { return map(String(num)) { String($0).toInt()! } }

toDigits(1234) // [1, 2, 3, 4]

Page 52: Swift Functional Programming

reverse([1, 2, 3, 4]) // [4, 3, 2, 1]

Page 53: Swift Functional Programming

func doubleSecond(nums: [Int]) -> [Int] { return map(enumerate(nums)) { i, x in i % 2 == 0 ? x : x * 2 } }

时 2

Page 54: Swift Functional Programming

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

Page 55: Swift Functional Programming

func sumDigits(nums: [Int]) -> Int { return sum(reduce(nums, []) { $0 + toDigits($1) }) }

sumDigits([1, 12, 3]) // 7

Page 56: Swift Functional Programming

func isValid(num: Int) -> Bool { return num % 10 == 0 }

Page 57: Swift Functional Programming

func isValid(num: Int) -> Bool { return num % 10 == 0 }

isValid(12) // false

Page 58: Swift Functional Programming

let validator = isValid • sumDigits • doubleSecond • reverse • toDigits

Page 59: Swift Functional Programming

let validator = isValid • sumDigits • doubleSecond • reverse • toDigitsvalidator(4716347184862961) // true

Page 60: Swift Functional Programming

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 }

⼈人 在

Page 61: Swift Functional Programming

infix operator |> { associativity left precedence 150 }

func |> <T,U> (lhs:T, rhs:T -> U ) -> U { return rhs(lhs) }

⼤大 得 想 Unix 多

Page 62: Swift Functional Programming

4716347184862961 |> toDigits • • • • • • • • • • • • • • • • • • • • • • • • • •

|> reverse • • • • • • • • •

|> doubleSecond • • • • • • • • • • • • • •

|> sumDigits • • • • • • • • • • •

|> isValid• • • • • • • • •

// true

Page 63: Swift Functional Programming

HλPPY HλCKING

- 起 下 来 - Functor , Applicative, Monad Swift 们 可 - ReactiveCocoa 可 - 了