🍰 Partial Application

Currying, Compose and Pipe

ꢌ κΈ°μ›…

@doondoony

2019. 2. 16

πŸ“š λͺ©μ°¨

웃을 λ•ŒκΉŒμ§€ ν•œλ‹€...

  1. Partial Application
  2. Currying
  3. Compose
  4. pipe
  5. go vs pipe

πŸ“š λͺ©μ°¨

πŸ™„ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°?

map, filter, reduce...

λͺ°λΌ... 그게 뭐야 λ¬΄μ„œμ›Œ...

ν•¨μˆ˜λ™μƒ ν”„λ‘œκ·Έλž˜λ°μ€μš”? μ—Œγ…‹γ…‹

κ·Έκ±° 뭐 막 되게 쒋은거라고...

λΆ€μˆ˜νš¨κ³Ό... λ™μ‹œμ„±... μ‹€ν–‰μ‹œμ μ— ꡬ애받지 μ•ŠλŠ”...

μ˜€λŠ˜μ€ λ”± 주어진 μ£Όμ œμ—λ§Œ μΆ©μ‹€ν•˜λ €κ³  ν•©λ‹ˆλ‹€

μ„±μ˜κ» 해보렀고 ν•˜λ‹€κ°€λŠ” μ œκ°€ 이해λ₯Ό λͺ»ν•΄μš”

Β 

λͺ»λ‚œ λ°œν‘œμžλ₯Ό λ‘” μŠ€ν„°λ””μ›λ“€μ—κ²Œ λ―Έμ•ˆν•˜λ‹€μ•„μ•„μ•…!

✍ Pre-requisite

✍ Pre-requisite

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

  1. 순수 ν•¨μˆ˜λ‘œ 이루어진 ν•¨μˆ˜ λ“€μ˜ 쑰합을 ν†΅ν•œ κ΅¬ν˜„μ„ 도λͺ¨
  2. λΆˆλ³€μ„±κ³Ό μ°Έμ‘° 투λͺ…성을 μœ μ§€ν•˜μ—¬ 디버깅, ν…ŒμŠ€νŒ…
    그리고 λ™μ‹œμ„± μ²˜λ¦¬μ— 유리
  3. ν”„λ‘œκ·Έλž¨μ€ 데이터와 그것을 μ²˜λ¦¬ν•˜λŠ” 순수 ν•¨μˆ˜λ‘œ ꡬ성

✍ Pre-requisite

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κΈ° 전에

우리 λͺ¨λ‘κ°€ μ•Œκ³  μžˆλŠ” κ°œλ…λ“€

✍ Pre-requisite

1. Spread Operator ...

사싀 μ •ν™•ν•˜κ²ŒλŠ” Spread, Rest Syntax μž…λ‹ˆλ‹€

μ—°μ‚°μžμ˜ νŠΉμ„±μ€ ... 에 쑴재 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

(지연 평가, Infix Notation ~ μ€‘μ ˆ ν‘œκΈ° ~ λ“±)

✍ Pre-requisite

2. Higher-Order Function

First Class Function κ³ΌλŠ” λ‹€λ₯Έ μ˜λ―Έμž…λ‹ˆλ‹€!

  1. ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€
  2. ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜써 전달할 수 μžˆμ–΄μ•Ό ν•œλ‹€

✍ Pre-requisite

3. First Class Function

Higher-Order Function κ³ΌλŠ” λ‹€λ₯Έ μ˜λ―Έμž…λ‹ˆλ‹€!

ν•¨μˆ˜κ°€ 일급 객체 (First Class Citizen)Β μž„μ„ 의미

μ–Έμ–΄ μ°¨μ›μ—μ„œ μ΄λŸ¬ν•œ κΈ°λŠ₯을 지원 ν•΄μ£ΌλŠλƒμ— 따라 κ°ˆλ¦°λ‹€

  1. λ³€μˆ˜λ‚˜ 데이터에 ν• λ‹Ήν•  수 μžˆλ‹€
  2. 객체의 인자 κ°’μœΌλ‘œ 전달할 수 μžˆλ‹€
  3. 객체의 리턴 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€

✍ Pre-requisite

4. for ... of

Iterator Protocol 을 λ”°λ₯΄λŠ” λͺ¨λ“  Collection 객체λ₯Ό μˆœνšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€

✍ Pre-requisite

Iterable, Iterator, Generator, Iterator Protocol 은 λ‹€λ₯Έ λΆ„ λ°œν‘œ μ‹œκ°„μ— ν—€ν—€

🍰 Partial Application

🍰 Partial Application

f: (X, Y, Z) β†’ N
f:(X,Y,Z)β†’Nf: (X, Y, Z) β†’ N
partial(f): (Y, Z) β†’ N
partial(f):(Y,Z)β†’Npartial(f): (Y, Z) β†’ N
f_{partial}(2,3)
fpartial(2,3)f_{partial}(2,3)

🍰 Partial Application

🍰 Partial Application

μš°μ„ , Application μ΄λΌλŠ” λ‹¨μ–΄μ˜ μ˜λ―ΈλŠ”

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“œλŠ” μš°λ¦¬κ°€ μ•„λŠ” κ·Έ μ˜λ―Έκ°€ μ•„λ‹Œ

Β 

"λΆ€λΆ„ 적용"

🍰 Partial Application

무엇을 λΆ€λΆ„ 적용 ν•˜λŠ”κ±΄κ°€μš”?

"ν•¨μˆ˜μ˜ 인자λ₯Ό λΆ€λΆ„μ μœΌλ‘œ μ μš©ν•©λ‹ˆλ‹€"

🍰 Partial Application

Partial Application 은 λΆ€λΆ„ 적용 ν›„μ—λŠ”

더 μ΄μƒμ˜ papply 없이 ν•¨μˆ˜ 호좜이 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€

🍰 Partial Application

Note

  1. Currying κ³ΌλŠ” λ‹€λ₯΄λ‹€. Currying κ³ΌλŠ”!
  2. λΆ€λΆ„μ μš©μ€ polyadic function(λ‹€κ°€ μ›μ†Œ ν•¨μˆ˜) 의 인자λ₯Ό 미리 λΆ€λΆ„μ μš©
    ν•˜λ‚˜ λ˜λŠ” λͺ‡ 개의 인자λ₯Ό 쀄인 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€

πŸ› Currying

πŸ› Curry...?

πŸ› Curry...?

πŸ› Currying

πŸ› Currying

{\displaystyle h(x)(y)=x+y^{2}=f(x,y)}
h(x)(y)=x+y2=f(x,y){\displaystyle h(x)(y)=x+y^{2}=f(x,y)}
{\displaystyle f(x,y,z)=h(x)(y)(z).}
f(x,y,z)=h(x)(y)(z).{\displaystyle f(x,y,z)=h(x)(y)(z).}

μ•„κΉŒλ³΄λ‹€λŠ” μ½μ„λ§Œ ν•˜μ‹œμ£ ...?

πŸ› Currying

Currying 은 "μ—¬λŸ¬κ°œμ˜ 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜" λ₯Ό

단항 ν•¨μˆ˜(Unary Function) 둜 μͺΌκ°œμ–΄

단항 ν•¨μˆ˜λ₯Ό 순차적으둜 μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€

πŸ› Currying

예λ₯Ό λ“€μ–΄ μ΄λ ‡κ²Œ μ¨μš”

πŸ’‘ Compose

πŸ’‘ Compose

μž„μ˜μ˜ 집합 X, Y, Z 및 두 ν•¨μˆ˜

f\colon X\to Y
f​:Xβ†’Yf\colon X\to Y
g\colon Y\to Z
g​:Yβ†’Zg\colon Y\to Z
g\circ f\colon X\to Z
g∘f​:Xβ†’Zg\circ f\colon X\to Z
g\circ f\colon x\in X\mapsto g(f(x))
g∘f​:x∈X↦g(f(x))g\circ f\colon x\in X\mapsto g(f(x))

κ°€ μ£Όμ–΄μ‘Œμ„λ•Œ, 이 두 ν•¨μˆ˜μ˜ ν•©μ„±

g\circ f
g∘fg\circ f

λŠ” λ‹€μŒκ³Ό κ°™λ‹€

πŸ’‘ Compose

πŸ’‘ Compose

g\circ f\colon x\in X\mapsto g(f(x))
g∘f​:x∈X↦g(f(x))g\circ f\colon x\in X\mapsto g(f(x))

이 λΆ€λΆ„Β 

g(f(x))
g(f(x))g(f(x))

λ§ŒνΌμ€ μ΅μˆ™ν•©λ‹ˆλ‹€.

μ€‘μ²©ν•΄μ„œ ν•¨μˆ˜ μ‚¬μš©ν•œ κ±°

πŸ’‘ Compose

Compose λŠ” ν•¨μˆ˜λ₯Ό μ‘°λ¦½ν•˜μ—¬
μƒˆλ‘œμš΄ κΈ°λŠ₯을 ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬μ„±ν•˜λŠ” 것

πŸ’‘ Compose

근데 add10 이 μ•„λ‹ˆλΌ λ‚΄κ°€ λ”°λ‘œ μ „λ‹¬ν•˜κ³  μ‹Άλ‹€λ©΄?

πŸ’‘ Compose

근데 add10 이 μ•„λ‹ˆλΌ λ‚΄κ°€ λ”°λ‘œ μ „λ‹¬ν•˜κ³  μ‹Άλ‹€λ©΄?

πŸ’‘ Compose

Currying 을 ν†΅ν•΄μ„œ ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν•œ 번 μ‘°ν•©!

🚰 pipe

🚰 pipe

ν•¨μˆ˜ 합성을 μœ„ν•œ ν•¨μˆ˜λ‘œλŠ”

pipe, compose κ°€ μžˆμŠ΅λ‹ˆλ‹€

Β 

큰 μ°¨μ΄λŠ” ν•¨μˆ˜ ν•©μ„±μ˜ λ°©ν–₯인데

pipeλŠ” LEFT β†’ RIGHT

composeλŠ” RIGHT β†’ LEFT

의 차이가 μžˆμŠ΅λ‹ˆλ‹€

🚰 pipe

또 λ‹€λ₯Έ νŠΉμ§•μ€


pipe λŠ” μ‹€ν–‰ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šκ³ 

ν•©μ„±λœ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€

🚰 compose

🚰 pipe

🚰 pipe

pipe 의 κ΅¬ν˜„ μ½”λ“œ 맛보기

πŸ‘‰ go vs pipe

πŸ‘‰ go vs pipe

μ•žμ„œ μ½”λ“œμ—μ„œ λ³΄μ…¨κ² μ§€λ§Œ

go λŠ” μ‹€ν–‰ κ²°κ³Όλ₯Ό λ°˜ν™˜
pipe λŠ” ν•©μ„±λœ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ ν•©λ‹ˆλ‹€

πŸ‘‰ Appendix / RxJS

πŸ‘‰ Appendix / RxJS

끝

κ°μ‚¬ν•©λ‹ˆλ‹€