swift functional programming
Post on 28-Jul-2015
96 Views
Preview:
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