본문으둜 κ±΄λ„ˆλ›°κΈ°

🍭 Chapter 1: ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λž€ 무엇인가?

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(functional programming, FP)은 κ°„λ‹¨ν•˜μ§€λ§Œ μ‹¬μ˜€ν•œ λœ»μ„ 담은 μ „μ œμ— κΈ°μ΄ˆν•œλ‹€. κ·Έ μ „μ œλž€, ν”„λ‘œκ·Έλž¨μ„ 였직 순수 ν•¨μˆ˜(pure function)λ“€λ‘œλ§Œ, λ‹€μ‹œ λ§ν•΄μ„œ λΆ€μˆ˜ 효과(side effect)κ°€ μ—†λŠ” ν•¨μˆ˜λ“€λ‘œλ§Œ κ΅¬μΆ•ν•œλ‹€λŠ” 것이닀. λΆ€μˆ˜ νš¨κ³Όκ°€ λ¬΄μ—‡μΌκΉŒ? κ·Έλƒ₯ κ²°κ³Όλ₯Ό λŒλ €μ£ΌλŠ” 것 μ΄μ™Έμ˜ μ–΄λ–€ 일을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ°€λ¦¬μΌœ λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν•¨μˆ˜λΌκ³  μΉ­ν•œλ‹€. "κ·Έλƒ₯ κ²°κ³Όλ₯Ό λŒλ €μ£ΌλŠ” 것 μ΄μ™Έμ˜ μ–΄λ–€ 일"의 예λ₯Ό λͺ‡ 가지 λ“€μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • λ³€μˆ˜λ₯Ό μˆ˜μ •ν•œλ‹€.
  • 자료ꡬ쑰λ₯Ό μ œμžλ¦¬μ—μ„œ μˆ˜μ •ν•œλ‹€.
  • 객체의 ν•„λ“œλ₯Ό μ„€μ •ν•œλ‹€.
  • μ˜ˆμ™Έ(exception)λ₯Ό λ˜μ§€κ±°λ‚˜ 였λ₯˜λ₯Ό λ‚΄λ©΄μ„œ 싀행을 μ€‘λ‹¨ν•œλ‹€.
  • μ½˜μ†”μ— 좜λ ₯ν•˜κ±°λ‚˜ μ‚¬μš©μžμ˜ μž…λ ₯을 읽어듀인닀.
  • νŒŒμΌμ— κΈ°λ‘ν•˜κ±°λ‚˜ νŒŒμΌμ—μ„œ 읽어듀인닀.
  • 화면에 κ·Έλ¦°λ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 방식에 λŒ€ν•œ μ œμ•½μ΄μ§€ ν‘œν˜„ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μ˜ μ’…λ₯˜μ— λŒ€ν•œ μ œμ•½μ΄ μ•„λ‹ˆλΌλŠ” 것이닀. 순수 ν•¨μˆ˜λ“€λ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄ λͺ¨λ“ˆμ„±(modularity)이 μ¦κ°€ν•œλ‹€. λͺ¨λ“ˆμ„± 덕뢄에 순수 ν•¨μˆ˜λŠ” 검사(test), μž¬μ‚¬μš©, 병렬화, μΌλ°˜ν™”, 뢄석이 쉽닀. 더 λ‚˜μ•„κ°€μ„œ, 순수 ν•¨μˆ˜λŠ” 버그가 생길 여지가 훨씬 적닀.

πŸŽƒ FP의 이점: κ°„λ‹¨ν•œ 예제 ν•˜λ‚˜β€‹

🎈 λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν”„λ‘œκ·Έλž¨β€‹

μ»€ν”Όμˆμ—μ„œ 컀피λ₯Ό κ΅¬λ§€ν•˜λŠ” 과정을 μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•œλ‹€κ³  κ°€μ •ν•˜μž. μš°μ„  κ΅¬ν˜„μ—μ„œ λΆ€μˆ˜ 효과λ₯Ό μ‚¬μš©ν•˜λŠ”(이λ₯Ό λΆˆμˆœν•œ[impure] ν”„λ‘œκ·Έλž¨μ΄λΌκ³  λΆ€λ₯΄κΈ°λ„ ν•œλ‹€) 슀칼라 ν”„λ‘œκ·Έλž¨λΆ€ν„° 보자.

class Cafe {
def buyCoffee(cc: CreditCard): Coffee = {
val cup = new Coffee()
// λΆ€μˆ˜ 효과, μ‹ μš©μΉ΄λ“œλ₯Ό μ‹€μ œλ‘œ μ²­κ΅¬ν•œλ‹€.
cc.charge(cup.price)
cup
}
}

μ‹ μš©μΉ΄λ“œ μ²­κ΅¬μ—λŠ” μ™ΈλΆ€ μ„Έκ³„μ™€μ˜ μΌμ •ν•œ μƒν˜Έμž‘μš©μ΄ κ΄€μ—¬ν•œλ‹€. κ·ΈλŸ¬λ‚˜ 이 ν•¨μˆ˜ μžμ²΄λŠ” 단지 ν•˜λ‚˜μ˜ Coffee 객체λ₯Ό λŒλ €μ€„ 뿐이고, κ·Έ μ™Έμ˜ λ™μž‘μ€ λͺ¨λ‘ λΆ€μˆ˜μ μœΌλ‘œ(on the side) μΌμ–΄λ‚œλ‹€.

λΆ€μˆ˜ νš¨κ³Όκ°€ 있기 λ•Œλ¬Έμ— 이 μ½”λ“œλŠ” κ²€μ‚¬ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€. μ½”λ“œλ₯Ό κ²€μ‚¬ν•˜κΈ° μœ„ν•΄ μ‹€μ œλ‘œ μ‹ μš©μΉ΄λ“œ νšŒμ‚¬μ™€ μ—°κ²°ν•΄μ„œ μΉ΄λ“œ 이용 λŒ€κΈˆμ„ μ²­κ΅¬ν•˜κ³  μ‹Άμ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. CreditCard λŒ€μ‹  지급을 μœ„ν•œ Payments 객체λ₯Ό buyCoffee에 μ „λ‹¬ν•œλ‹€λ©΄ μ½”λ“œμ˜ λͺ¨λ“ˆμ„±κ³Ό 검사성을 μ’€ 더 높일 수 μžˆλ‹€.

class Cafe {
def buyCoffee(cc: CreditCard, p: Payments): Coffee = {
val cup = new Coffee()
p.charge(cc, cup.price)
cup
}
}

p.charge(cc, cup.price)λ₯Ό ν˜ΈμΆœν•  λ•Œ μ—¬μ „νžˆ λΆ€μˆ˜ 효과λ₯Ό λ°œμƒν•˜μ§€λ§Œ, 적어도 검사성은 쑰금 λ†’μ•„μ‘Œλ‹€. 이 κ΅¬ν˜„μ—λŠ” buyCoffeeλ₯Ό μž¬μ‚¬μš©ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 또 λ‹€λ₯Έ λ¬Έμ œκ°€ μžˆλ‹€.

🎈 ν•¨μˆ˜μ  해법: λΆ€μˆ˜ 효과의 μ œκ±°β€‹

이에 λŒ€ν•œ ν•¨μˆ˜μ  해법은 λΆ€μˆ˜ νš¨κ³Όλ“€μ„ μ œκ±°ν•˜κ³  buyCoffeeκ°€ Coffee뿐만 μ•„λ‹ˆλΌ 청ꡬ건을 ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ 돌렀주게 ν•˜λŠ” 것이닀. 청ꡬ κΈˆμ•‘μ„ μ‹ μš©μΉ΄λ“œ νšŒμ‚¬μ— 보내고 κ²°κ³Όλ₯Ό κΈ°λ‘ν•˜λŠ” λ“±μ˜ 처리 λ¬Έμ œλŠ” buyCoffee λ°”κΉ₯의 λ‹€λ₯Έ μ–΄λ”˜κ°€μ—μ„œ ν•΄κ²°ν•˜λ„λ‘ ν•œλ‹€.

class Cafe {
def buyCoffee(cc: CreditCard): (Coffee, Charge) = {
val cup = new Coffee()
(cup, Charge(cc, cup.price))
}
}

이제 청ꡬ건의 생성 λ¬Έμ œκ°€ 청ꡬ건의 처리 λ˜λŠ” 연동 λ¬Έμ œμ™€ λΆ„λ¦¬λ˜μ—ˆλ‹€. buyCoffee ν•¨μˆ˜λŠ” 이제 Coffee 뿐만 μ•„λ‹ˆλΌ Charge도 λŒλ €μ€€λ‹€. 이런 λ³€κ²½ 덕뢄에 μ—¬λŸ¬ μž”μ˜ 컀피λ₯Ό ν•œ 번의 거래둜 κ΅¬λ§€ν•˜κΈ° μœ„ν•΄ 이 ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš©ν•˜κΈ°κ°€ μ‰¬μ›Œμ‘ŒμŒμ„ μž μ‹œ 후에 보게 될 것이닀. λ‹€μŒμ€ Charge 이닀.

case class Charge(cc: CreditCard, amount: Double) {
def combine(other: Charge): Charge =
if (cc == other.cc)
Charge(cc, amount + other.amount)
else
throw new Exception("Can't combine charges to different cards")
}

그럼 컀피 nμž”μ˜ ꡬ맀을 κ΅¬ν˜„ν•œ buyCoffees ν•¨μˆ˜λ₯Ό 보자. μ΄μ „κ³ΌλŠ” 달리, 이 ν•¨μˆ˜λŠ” buyCoffeeλ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.

class Cafe {
def buyCoffee(cc: CreditCard): (Coffee, Charge) = {
val cup = new Coffee()
(cup, Charge(cc, cup.price))
}

def buyCoffees(cc: CreditCard, n: Int): (List[Coffee], Charge) = {
val purchases: List[(Coffee, Charge)] = List.fill(n)(buyCoffee(cc))
val (coffees, charges) = purchases.unzip(coffees, charges.reduce((c1, c2) => c1.combine(c2)))
}
}

μ „λ°˜μ μœΌλ‘œ, 이 해법은 이전보닀 뚜렷이 κ°œμ„ λ˜μ—ˆλ‹€. μ΄μ œλŠ” buyCoffeeλ₯Ό 직접 μž¬μ‚¬μš©ν•΄μ„œ buyCoffees ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 있으며, 두 ν•¨μˆ˜ λͺ¨λ‘ Payments μΈν„°νŽ˜μ΄μŠ€μ˜ λ³΅μž‘ν•œ λͺ¨μ˜ κ΅¬ν˜„μ„ μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ μ†μ‰½κ²Œ 검사할 수 μžˆλ‹€. μ‹€μ œλ‘œ CafeλŠ” 이제 Charge의 λŒ€κΈˆμ΄ μ–΄λ–»κ²Œ μ²˜λ¦¬λ˜λŠ”μ§€ μ „ν˜€ μ•Œμ§€ λͺ»ν•˜λ‹€.

Chargeλ₯Ό 일급(first-class) κ°’μœΌλ‘œ λ§Œλ“€λ©΄, 청ꡬ건듀을 λ‹€λ£¨λŠ” 업무 논리λ₯Ό μ’€ 더 μ‰½κ²Œ 쑰립할 수 μžˆλ‹€λŠ” μ˜ˆμƒμΉ˜ λͺ»ν–ˆλ˜ 또 λ‹€λ₯Έ 이득이 생긴닀.

FPλŠ” μ•„μ£Ό κ°„λ‹¨ν•œ λ£¨ν”„μ—μ„œλΆ€ν„° κ³ μˆ˜μ€€ ν”„λ‘œκ·Έλž¨ κΈ°λ°˜κ΅¬μ €μ— 이λ₯΄κΈ°κΉŒμ§€ λͺ¨λ“  μˆ˜μ€€μ—μ„œ ν”„λ‘œκ·Έλž¨μ˜ 쑰직화 방식을 μ•„μ£Ό κΈ‰μ§„μ μœΌλ‘œ λ³€ν™”μ‹œν‚¨λ‹€. FPμ—μ„œ νŒŒμƒλ˜λŠ” μŠ€νƒ€μΌμ€ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ°μ˜ 것과 μƒλ‹Ήνžˆ λ‹€λ₯΄μ§€λ§Œ, 그것은 아름닡고 응집λ ₯ μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° 접근방식이닀.

πŸŽƒ (순수)ν•¨μˆ˜λž€ ꡬ체적으둜 무엇인가?​

μž…λ ₯ ν˜•μ‹μ΄ A이고 좜λ ₯ ν˜•μ‹μ΄ B인 ν•¨μˆ˜ fλŠ” ν˜•μ‹μ΄ A인 λͺ¨λ“  κ°’ aλ₯Ό 각각 ν˜•μ‹μ΄ B인 ν•˜λ‚˜μ˜ κ°’ b에 μ—°κ΄€μ‹œν‚€λ˜, bκ°€ 였직 a의 값에 μ˜ν•΄μ„œλ§Œ κ²°μ •λ˜λ‚˜λŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” 계산이닀. λ‚΄λΆ€ λ˜λŠ” μ™ΈλΆ€ κ³΅μ •μ˜ μƒνƒœ 변경은 f(a)의 κ²°κ³Όλ₯Ό κ³„μ‚°ν•˜λŠ” 데 μ–΄λ– ν•œ 영ν–₯도 주지 μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€μ–΄ Int => String ν˜•μ‹μ˜ intToString ν•¨μˆ˜λŠ” λͺ¨λ“  μ •μˆ˜λ₯Ό 그에 λŒ€μ‘λ˜λŠ” λ¬Έμžμ—΄μ— λŒ€μ‘μ‹œν‚¨λ‹€. 그리고 이것이 만일 μ‹€μ œ ν•¨μˆ˜(function)이면, κ·Έ μ™Έμ˜ 일은 μ „ν˜€ ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ‹€λ₯Έ 말둜 ν•˜λ©΄, ν•¨μˆ˜λŠ” 주어진 μž…λ ₯으둜 λ­”κ°€λ₯Ό κ³„μ‚°ν•˜λŠ” 것 μ™Έμ—λŠ” ν”„λ‘œκ·Έλž¨μ˜ 싀행에 κ·Έ μ–΄λ–€ κ΄€μ°° κ°€λŠ₯ν•œ 영ν–₯도 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€. 이λ₯Ό 두고 ν•¨μˆ˜μ— λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λ‹€κ³  λ§ν•œλ‹€. 그런 ν•¨μˆ˜λ₯Ό μ’€ 더 λͺ…μ‹œμ μœΌλ‘œ 순수(pure) ν•¨μˆ˜λΌκ³  λΆ€λ₯΄κΈ°λ„ ν•˜μ§€λ§Œ, μ΄λŠ” λ‹€μ†Œ ꡰ더더기이닀. νŠΉλ³„ν•œ 언급이 μ—†λŠ” ν•œ, 이 μ±…μ—μ„œ ν•¨μˆ˜λŠ” λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•œλ‹€.

순수 ν•¨μˆ˜μ˜ μ΄λŸ¬ν•œ κ°œλ…μ„ μ°Έμ‘° 투λͺ…μ„±(referential transparency, RT)μ΄λΌλŠ” κ°œλ…μ„ μ΄μš©ν•΄μ„œ 곡식화할 수 μžˆλ‹€. μ°Έμ‘° 투λͺ…성은 ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ ν‘œν˜„μ‹(expression)의 ν•œ 속성이닀. 에λ₯Ό λ“€μ–΄ 2 + 3은 ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μ΄λ‹€. 이 ν‘œν˜„μ‹μ€ κ°’ 2와 3에 순수 ν•¨μˆ˜ +λ₯Ό μ μš©ν•œλ‹€. 이 ν‘œν˜„μ‹μ—λŠ” λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λ‹€. 이 ν‘œν˜„μ‹μ˜ ν‰κ°€λŠ” 항상 5λΌλŠ” 같은 κ²°κ³Όλ₯Ό λ‚Έλ‹€. μ‹€μ œλ‘œ, ν”„λ‘œκ·Έλž¨μ— μžˆλŠ” λͺ¨λ“  2 + 3을 κ°’ 5둜 바꾸어도 ν”„λ‘œκ·Έλž¨μ˜ μ˜λ―ΈλŠ” μ „ν˜€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

이것이 λ°”λ‘œ ν‘œν˜„μ‹μ˜ μ°Έμ‘° 투λͺ…μ„±μ˜ 전뢀이닀. 즉, μž„μ˜μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ 만일 μ–΄λ–€ ν‘œν˜„μ‹μ„ κ·Έ 평가 결과둜 바꾸어도 ν”„λ‘œκ·Έλž¨μ˜ μ˜λ―Έκ°€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ κ·Έ ν‘œν˜„μ‹μ€ 참쑰에 투λͺ…ν•œ 것이닀. 그리고 만일 μ–΄λ–€ ν•¨μˆ˜λ₯Ό 참쑰에 투λͺ…ν•œ μΈμˆ˜λ“€λ‘œ ν˜ΈμΆœν•˜λ©΄, κ·Έ ν•¨μˆ˜λ„ 참쑰에 투λͺ…ν•˜λ‹€.

🎈 μ°Έμ‘° 투λͺ…μ„±, μˆœμˆ˜μ„±, 그리고 μΉ˜ν™˜ λͺ¨ν˜•β€‹

μ°Έμ‘° 투λͺ…μ„±μ˜ μ •μ˜κ°€ μ›λž˜μ˜ buyCoffee μ˜ˆμ œμ— μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

def buyCoffee(cc: CreditCard): Coffee = {
val cup = new Coffee()
cc.charge(cup.price)
cup
}

cc.charge(cup.price)의 λ°˜ν™˜ ν˜•μ‹μ΄ 무엇이든, buyCoffeeλŠ” κ·Έ λ°˜ν™˜κ°’μ„ νκΈ°ν•œλ‹€. λ”°λΌμ„œ buyCoffee(aliceCreditCard)의 평가 κ²°κ³ΌλŠ” κ·Έλƒ₯ cup이며, μ΄λŠ” new Coffee()와 λ™λ“±ν•˜λ‹€. μ•žμ˜ μ°Έμ‘° 투λͺ…μ„± μ •μ˜ν•˜μ—μ„œ buyCoffeeκ°€ μˆœμˆ˜ν•˜λ €λ©΄ μž„μ˜μ˜(any) p에 λŒ€ν•΄ p(buyCoffee(aliceCreditCard))κ°€ p(new Coffee())와 λ™μΌν•˜κ²Œ μž‘λ™ν•΄μ•Ό ν•œλ‹€. 이 쑰건이 참이 μ•„λ‹˜μ€ λͺ…λ°±ν•˜λ‹€. new Coffee()λΌλŠ” ν”„λ‘œκ·Έλž¨μ€ 아무 일도 ν•˜μ§€ μ•Šμ§€λ§Œ buyCoffee(aliceCreditCard)λŠ” μ‹ μš©μΉ΄λ“œ νšŒμ‚¬μ— μ—°κ²°ν•΄μ„œ λŒ€κΈˆμ„ μ²­κ΅¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μ°Έμ£Ό 투λͺ…성은 ν•¨μˆ˜κ°€ μˆ˜ν–‰ν•˜λŠ” λͺ¨λ“  것이 ν•¨μˆ˜κ°€ λŒλ €μ£ΌλŠ” κ°’μœΌλ‘œ λŒ€ν‘œλœλ‹€λŠ” λΆˆλ³€ 쑰건을 κ°•μ œν•œλ‹€. μ΄λŸ¬ν•œ μ œμ•½μ„ 지킀면 μΉ˜ν™˜ λͺ¨ν˜•μ΄λΌκ³  λΆ€λ₯΄λŠ”, ν”„λ‘œκ·Έλž¨ 평가에 λŒ€ν•œ κ°„λ‹¨ν•˜κ³ λ„ μžμ—°μŠ€λŸ¬μš΄ μΆ”λ‘  λͺ¨ν˜•μ΄ κ°€λŠ₯해진닀. 참쑰에 투λͺ…ν•œ ν‘œν˜„μ‹λ“€μ˜ 계산 과정은 마치 λŒ€μˆ˜ λ°©μ •μ‹μ˜ ν’€ λ•Œμ™€ μ•„μ£Ό λΉ„μŠ·ν•˜λ‹€. 즉, ν‘œν˜„μ‹μ˜ λͺ¨λ“  뢀뢄을 μ „κ°œν•˜κ³ , λͺ¨λ“  λ³€μˆ˜λ₯Ό ν•΄λ‹Ή κ°’μœΌλ‘œ μΉ˜ν™˜ν•˜κ³ , 그런 λ‹€μŒ 그것듀을 κ°€μž₯ κ°„λ‹¨ν•œ ν˜•νƒœλ‘œ ν™˜μ›(μΆ•μ•½)ν•˜λ©΄ λœλ‹€. 각 λ‹¨κ³„λ§ˆλ‹€ ν•˜λ‚˜μ˜ 항을 그에 λ™λ“±ν•œ κ²ƒμœΌλ‘œ λŒ€μ²΄ν•œλ‹€. 즉 계산은 λ“±μΉ˜ λŒ€ λ“±μΉ˜(equals for equals) μΉ˜ν™˜μ„ ν†΅ν•΄μ„œ μ§„ν–‰λœλ‹€. λ‹€λ₯Έ 말둜 ν•˜λ©΄, μ°Έμ‘° 투λͺ…성은 ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 등식적 μΆ”λ‘ (equational reasoning)을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

μΉ˜ν™˜ λͺ¨ν˜• 좔둠은 ν‰κ°€μ˜ λΆ€μˆ˜ νš¨κ³Όκ°€ μ „μ μœΌλ‘œ κ΅­μ†Œμ μ΄λ‹€. λ”°λΌμ„œ μ½”λ“œ 블둝을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ λ¨Έλ¦Ώμ†μ—μ„œ 일련의 μƒνƒœ 갱신듀을 λ”°λΌκ°ˆ ν•„μš”κ°€ μ—†λ‹€. κ΅­μ†Œ μΆ”λ‘ (local reasoning)λ§ŒμœΌλ‘œλ„ μ½”λ“œλ₯Ό 이해할 수 μžˆλ‹€. ν•¨μˆ˜μ˜ μ‹€ν–‰ 이전과 이후에 λ°œμƒν•  수 μžˆλŠ” λͺ¨λ“  μƒνƒœ 변화듀을 λ¨Έλ¦Ώμ†μœΌλ‘œ μ§šμ–΄ λ‚˜κ°€μ§€ μ•Šκ³ λ„ ν•¨μˆ˜κ°€ ν•˜λŠ” 일을 이해할 수 μžˆλŠ” 것이닀. κ·Έλƒ₯ ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό 보고 ν•¨μˆ˜ λ³Έλ¬Έμ—μ„œ μΈμˆ˜λ“€μ„ μΉ˜ν™˜ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. λ°”λ‘œ μΉ˜ν™˜ λͺ¨ν˜•μœΌλΌλŠ” ꡬ체적인 μš©μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ”λΌλ„, μžμ‹ μ˜ μ½”λ“œλ₯Ό μΆ”λ‘ ν•  λ•Œ λ…μžλ„ μ•„λ§ˆ 이런 λͺ¨ν˜•μ„ μ‚¬μš©ν•΄ 왔을 것이닀.

μˆœμˆ˜μ„±μ˜ κ°œλ…μ„ 이런 μ‹μœΌλ‘œ 곡식화해 보면, ν•¨μˆ˜μ  ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“ˆμ„±μ΄ λ‹€λ₯Έ κ²½μš°μ— λΉ„ν•΄ 더 쒋은 κ²½μš°κ°€ λ§Žμ€ 이유λ₯Ό μ§μž‘ν•  수 μžˆλ‹€. λͺ¨λ“ˆμ μΈ ν”„λ‘œκ·Έλž¨μ€ μ „μ²΄μ™€λŠ” λ…λ¦½μ μœΌλ‘œ μ΄ν•΄ν•˜κ³  μž¬μ‚¬μš©ν•  수 μžˆλŠ” κ΅¬μ„±μš”μ†Œλ“€λ‘œ κ΅¬μ„±λœλ‹€. 그런 ν”„λ‘œκ·Έλž¨μ—μ„œ ν”„λ‘œκ·Έλž¨ μ „μ²΄μ˜ μ˜λ―ΈλŠ” 였직 κ΅¬μ„±μš”μ†Œλ“€μ˜ μ˜λ―Έμ™€ κ΅¬μ„±μš”μ†Œλ“€μ˜ 합성에 κ΄€ν•œ κ·œμΉ™λ“€μ—λ§Œ μ˜μ‘΄ν•œλ‹€. 즉, κ΅¬μ„±μš”μ†Œλ“€μ€ ν•©μ„± κ°€λŠ₯(composable)ν•˜λ‹€. 순수 ν•¨μˆ˜λŠ” λͺ¨λ“ˆμ μ΄κ³  ν•©μ„± κ°€λŠ₯ν•œλ°, μ΄λŠ” 순수 ν•¨μˆ˜μ—μ„œ 계산 자체의 논리가 "결과둜 무엇을 ν•  것인가"λ‚˜ "μž…λ ₯을 μ–΄λ–»κ²Œ 얻을 것인가"μ™€λŠ” λΆ„λ¦¬λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€. 즉, 순수 ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ λΈ”λž™λ°•μŠ€μ΄λ‹€. μž…λ ₯이 μ£Όμ–΄μ§€λŠ” 방식은 단 ν•˜λ‚˜μ΄λ‹€. μž…λ ₯은 항상 ν•¨μˆ˜μ— λŒ€ν•œ μΈμˆ˜λ“€λ‘œλ§Œ 주어진닀. 그리고 ν•¨μˆ˜λŠ” κ²°κ³Όλ₯Ό κ³„μ‚°ν•΄μ„œ λŒλ €μ€„ 뿐, 그것이 μ–΄λ–»κ²Œ μ“°μ΄λŠ”μ§€λŠ” μ‹ κ²½ 쓰지 μ•ŠλŠ”λ‹€. μ΄λŸ¬ν•œ κ΄€μ‹¬μ‚¬μ˜ 뢄리 덕뢄에 계산 λ…Όλ¦¬μ˜ μž¬μ‚¬μš©μ„±μ΄ 높아진닀. 결고에 κ΄€λ ¨λœ λΆ€μˆ˜ νš¨κ³Όλ‚˜ μž…λ ₯에 μ–»λŠ” 데 κ΄€λ ¨ λΆ€μˆ˜ νš¨κ³Όκ°€ λͺ¨λ“  λ¬Έλ§₯μ—μ„œ μ μ ˆν•œμ§€ κ±±μ •ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜λ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ‹€.