Skip to content

Latest commit

 

History

History
151 lines (84 loc) · 2.38 KB

01차-발표자료.md

File metadata and controls

151 lines (84 loc) · 2.38 KB

고차함수


map

변형 기존 컨테이너값은 변경되지않고 새로운 컨테이너 반환 for - in구문과 큰차이가 없음 컴파일러 최적화 측면에서 성능이 좋음 코드 재사용 용이

let optionalArr: [Int?] = [1,2,nil,5]
let mapped = optionalArr.map{ $0 }
print(mapped)
/*
[Optional(1), Optional(2), nil, Optional(5)]
*/

flatMap

추출 flat deprecated ➡️ instead use to compactMap


compactMap

let optionalArr: [Int?] = [1,2,nil,5]
let compactmapped = optionalArr.compactMap{ $0 }
print(compactmapped)  
/*
[1, 2, 5]
*/

filter

true이면 값을 포함, false이면 미포함 시키며 새로운 컨테이너를 생성해서 반환한다.

let optionalArr: [Int?] = [1,2,nil,5]
let filtered = optionalArr.compactMap{$0}.filter{$0>2}
print(filtered)
// [5]

forEach

map은 새로운 컨테이너를 반환을 하지만 forEach는 블럭내에서만 동작하고 반환값이 없다.

optionalArr.forEach { print($0) }
/*
Optional(1)
Optional(2)
nil
Optional(5)
*/

reduce

결합 초기값설정가능, 초기값은 처음 $0에 들어간다. 컨테이너 내부를 하나로 합쳐주는 기능

let sumReduce2 = reduceNum.reduce(3) { $0 + $1 }
// 9


Context

  • 상자, 껍데기
  • Swift의 Optional 같이 값이 있을 수 도있고, 없을 수 도있는 값을 넣는 상자라고 비유 할 수 있다.
  • 어떠한 값을 넣을 수 있는 상자 라고 표현한다.


Functor

  • 함수객체
  • 고차함수 map을 적용 할 수 있는 컨테이너 타입
  • Context값이 있는지 없는지 모르고 상자를 열어봐야 알수 있다.
  • 서로 다른 타입이기 때문에 Int? 와 Int는 연산 할 수 없다. 그래서 이것을 꺼내는 작업이 map


Monad

  • 무엇으로도 나눌 수 없는 궁극적인 실체

  • 함수 객체의 일종 ➡️ 모나드에는 map을 적용 할 수 있다. 여기에 Context개념을 더한것

  • 모나드는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 함수객체 타입 ➡️ 모나드는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 map을 적용 할 수 있는 타입

  • Optional은 모나드 즉, Optional은 함수객체이면서 모나드이다.