swift functional programming

Post on 28-Jul-2015

96 Views

Category:

Engineering

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Functional Programming

“ 们 ”

FP 可

Swift 们

FP 们 OC ReactiveCocoa 能

Functional Programmingin

“ 们 ”

FP 可

Swift 们

FP 们 OC ReactiveCocoa 能

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

• &��� �

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

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

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

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

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

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

0�

FP

SICP 最

- 分 很 ⼦子- 上 - 上 是

'.+ . 1"

很 lambda 个 去 . 想

'.+ . 1"

λ

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

-0�

-0�

• ��0�����

-0�

• ��0�����

• �0���,�!

看 上 来 就来 ⼀一

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

7992739871331789372997

799273987133178937299731789372997

799273987133178937299731789372997

3271696749187

799273987133178937299731789372997

327169674918732779674997

799273987133178937299731789372997

327169674918732779674997

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

799273987133178937299731789372997

327169674918732779674997

3+2+7+7+9+6+7+4+9+9+7=7070 % 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 • toDigitsvalidator(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 可 - 了

top related