[λ²ˆμ—­] ν”„λ‘œκ·Έλž˜λ¨Έλ₯Ό μœ„ν•œ μΉ΄ν…Œκ³ λ¦¬ 이둠 - 2. νƒ€μž…κ³Ό ν•¨μˆ˜

    [λ²ˆμ—­] ν”„λ‘œκ·Έλž˜λ¨Έλ₯Ό μœ„ν•œ μΉ΄ν…Œκ³ λ¦¬ 이둠 - 2. νƒ€μž…κ³Ό ν•¨μˆ˜


    νƒ€μž…κ³Ό ν•¨μˆ˜λ‘œ 이루어진 μΉ΄ν…Œκ³ λ¦¬λŠ” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ½€λ‚˜ μ€‘μš”ν•œ 역할을 ν•œλ‹€. 자 이제 νƒ€μž…μ΄λΌλŠ” 것이 무엇이며 μ™œ 이런 κ°œλ…μ΄ ν•„μš”ν•œμ§€μ— λŒ€ν•΄ 이야기λ₯Ό ν•΄λ³΄μž.

    2.1 μ–΄λ–€ μ΄λ“€μ—κ²Œ νƒ€μž…μ΄ ν•„μš”ν•œκ°€?

    μ •μ νƒ€μž…κ³Ό λ™μ νƒ€μž…, 그리고 κ°•νƒ€μž…κ³Ό μ•½νƒ€μž…μ˜ 각각의 μž₯단점에 λŒ€ν•΄μ„œλŠ” μ•½κ°„μ˜ λ…Όλž€μ΄ μ‘΄μž¬ν•œλ‹€. ν•œλ²ˆ κ°„λ‹¨ν•œ μ‚¬κ³ μ‹€ν—˜μ„ 톡해 이 선택듀에 λŒ€ν•΄ ν•œλ²ˆ μƒμƒν•΄λ³΄μž. μ—¬κΈ° 수백만 마리의 μ›μˆ­μ΄κ°€ 컴퓨터 ν‚€λ³΄λ“œ μ•žμ— 앉아 ν–‰λ³΅ν•œ 기뢄을 느끼며 μ•„λ¬΄λŸ° ν‚€λ‚˜ λžœλ€ν•˜κ²Œ λˆ„λ₯΄κ³ , ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κ³ , μ»΄νŒŒμΌν•˜κ³ , μ‹€ν–‰μ‹œν‚€κ³  μžˆλ‹€.

    λ§Œμ•½ μ›μˆ­μ΄λ“€μ΄ 기계어λ₯Ό μ‚¬μš©ν•˜λŠ” 상황이라면 이듀이 λ§Œλ“  μ–΄λ– ν•œ λ°”μ΄νŠΈλ“€μ˜ 쑰합이든 λͺ¨λ‘ ν—ˆμš©λ˜κ³  싀행될 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ›μˆ­μ΄λ“€μ΄ κ³ κΈ‰ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ–΄νœ˜ 및 문법 였λ₯˜λ₯Ό μž‘μ•„μ€€λ‹€λŠ” 사싀에 κ·Έμ € κ°μ‚¬ν•˜κ²Œ 될 것이닀. 비둝 λ§Žμ€ μ›μˆ­μ΄λ“€μ΄ λ°”λ‚˜λ‚˜λ₯Ό 받지 λͺ»ν•˜κ³  λ– λ‚˜κ²Œ λ˜κ² μ§€λ§Œ, κ·Έλ‚˜λ§ˆ μœ μ§€λ³΄μˆ˜ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄λ‚Ό 수 μžˆμ„ν…Œλ‹ˆ 말이닀.

    νƒ€μž… 체킹은 λ¬΄μ˜λ―Έν•˜κ²Œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ ν•˜λ‚˜μ˜ 방어막이라고 λ³Ό 수 μžˆλ‹€. 더 λ‚˜μ•„κ°€ νƒ€μž…μ˜ 뢈일치λ₯Ό λŸ°νƒ€μž„μ—μ„œλ§Œ μž‘μ•„λ‚Ό 수 μžˆλŠ” 동적 νƒ€μž… 언어와 λ‹€λ₯΄κ²Œ, κ°•λ ₯ν•˜κ²Œ νƒ€μž…μ΄ μ •μ μœΌλ‘œ μ²΄ν¬λ˜λŠ” μ–Έμ–΄μ—μ„œλŠ” νƒ€μž…μ˜ λΆˆμΌμΉ˜κ°€ 컴파일 νƒ€μž„μ— 발견되기 λ•Œλ¬Έμ— ꡳ이 싀행해보지 μ•Šλ”λΌλ„ 잘λͺ»λœ ν”„λ‘œκ·Έλž¨λ“€μ„ μž‘μ•„λ‚Ό 수 μžˆλ‹€.


    μš°λ¦¬μ—κ²ŒλŠ” 이 μ›μˆ­μ΄λ“€μ„ ν–‰λ³΅ν•˜κ²Œ λ§Œλ“œλŠ” 것이 μ€‘μš”ν• κΉŒ? μ•„λ‹ˆλ©΄ μ •ν™•ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œλŠ” 것이 μ€‘μš”ν• κΉŒ?

    일반적으둜 μ΄λŸ¬ν•œ μ›μˆ­μ΄ μ‚¬κ³ μ‹€ν—˜μ˜ λͺ©ν‘œλŠ” λ°”λ‘œ μ…°μ΅μŠ€ν”Όμ–΄μ˜ 전집을 λ§Œλ“€μ–΄λ‚΄λŠ” 것이며, μ΄λ•Œ λ§žμΆ€λ²• 검사기와 문법 검사기λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ 성곡 ν™•λ₯ μ€ 크게 μ¦κ°€ν•œλ‹€. λ§Œμ•½ νƒ€μž… 검사기와 λΉ„μŠ·ν•œ 것이 μžˆλ‹€λ©΄ 둜미였λ₯Ό 인간이라고 ν‘œν˜„ν•΄λ†“κ³  λœ¬κΈˆμ—†μ΄ κ·Έμ—κ²Œμ„œ λ‚˜λ­‡μžŽμ΄ μžλž€λ‹€κ³  ν•˜κ±°λ‚˜, λ‘œλ―Έμ˜€κ°€ λΈ”λž™ν™€μ΄ λ˜μ–΄ κ°•λ ₯ν•œ 쀑λ ₯μž₯으둜 κ΄‘μžλ₯Ό μ‚¬λ‘œμž‘κ±°λ‚˜ ν•˜λŠ” 상황을 λ°©μ§€ν•¨μœΌλ‘œμ¨ μ…°μ΅μŠ€ν”Όμ–΄ μ „μ§‘μ˜ 정밀도λ₯Ό λ†’ν˜€λ‚˜κ°ˆ 수 μžˆμ„ 것이닀.

    2.2 ν•©μ„±κ³Ό κ΄€λ ¨λœ νƒ€μž…

    μ•žμ„œ μ΄μ•ΌκΈ°ν–ˆλ“―μ΄ μΉ΄ν…Œκ³ λ¦¬ 이둠은 κ²°κ΅­ ν™”μ‚΄ν‘œλ₯Ό ν•©μ„±ν•˜λŠ” 것이닀. ν•˜μ§€λ§Œ μž„μ˜μ˜ 두 ν™”μ‚΄ν‘œλ₯Ό μ•„λ¬΄λ ‡κ²Œλ‚˜ ν•©μ„±ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. ν•œ ν™”μ‚΄ν‘œμ˜ λͺ©ν‘œμΈ λŒ€μƒμ€ λ‹€μŒ ν™”μ‚΄ν‘œμ˜ 좜발 λŒ€μƒκ³Ό 동일해야 ν•œλ‹€. ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” ν•œ ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό λ‹€λ₯Έ ν•¨μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 것과 λ™μΌν•˜λ‹€κ³  λ³Ό 수 μžˆλ‹€. λ§Œμ•½ ν•©μ„±ν•˜λ €κ³  ν•˜λŠ” ν•¨μˆ˜μ˜ 결과물을 λ‹€λ₯Έ ν•¨μˆ˜κ°€ μ œλŒ€λ‘œ 해석할 수 μ—†λŠ” 경우 ν”„λ‘œκ·Έλž¨μ€ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ„ 것이닀. 즉, 합성이 μ œλŒ€λ‘œ 되렀면 μ–‘ 끝단이 μΌμΉ˜ν•΄μ•Ό ν•œλ‹€λŠ” 것이며, ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ μ œκ³΅ν•˜λŠ” νƒ€μž… μ‹œμŠ€ν…œμ΄ κ°•λ ₯ν• μˆ˜λ‘ μ΄λŸ¬ν•œ 일치 μ—¬λΆ€λ₯Ό 잘 ν‘œν˜„ν•  수 있고, κΈ°κ³„μ μœΌλ‘œ 잘 검증할 μˆ˜λ„ μžˆλ‹€.

    λ‚΄κ°€ λ“€μ—ˆλ˜ μ •μ νƒ€μž…, κ°•νƒ€μž… 체킹에 λŒ€ν•œ λ°˜λŒ€ 의견 쀑 μœ μΌν•˜κ²Œ 일리가 μžˆμ—ˆλ˜ 것은 λ°”λ‘œ νƒ€μž…μ€ λ§žμ§€ μ•Šλ”λΌλ„ μ˜λ―Έμ μœΌλ‘œλŠ” μ˜¬λ°”λ₯Έ 일뢀 ν”„λ‘œκ·Έλž¨μ΄ 배제될 μˆ˜λ„ μžˆλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€. ν•˜μ§€λ§Œ μ‹€μ œλ‘œ 이런 일은 극히 λ“œλ¬ΌκΈ°λ„ ν•˜κ³ , λͺ¨λ“  정적 νƒ€μž…, κ°•νƒ€μž… μ–Έμ–΄λŠ” νƒ€μž… μ‹œμŠ€ν…œμ„ λ¬΄μ‹œν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•΄μ£ΌκΈ°λ„ ν•œλ‹€.

    심지어 Haskell에도 unsafeCoerce λΌλŠ” 녀석이 μ‘΄μž¬ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ κΈ°λŠ₯듀은 맀우 μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€. ν”„λž€μΈ  μΉ΄ν”„μΉ΄μ˜ μ†Œμ„€μΈ β€œλ³€μ‹ β€μ˜ 주인곡인 Gregor SamsaλŠ” μ–΄λŠ λ‚  κ°‘μžκΈ° κ±°λŒ€ν•œ λ²Œλ ˆκ°€ λ˜μ–΄λ²„λ¦¬λ©΄μ„œ νƒ€μž… μ‹œμŠ€ν…œμ„ 깨뜨렸고, κ²°κ΅­ κ·Έ κ²°κ³Όκ°€ μ–΄λ• λŠ”μ§€λŠ” 우리 λͺ¨λ‘ 잘 μ•Œκ³  μžˆλ‹€.

    πŸ’‘ μ—­μ£Ό

    μ†Œμ„€ λ³€μ‹ μ—μ„œμ˜ Gregor SamsaλŠ” μ–΄λŠ λ‚  κ°‘μžκΈ° κ±°λŒ€ν•œ λ²Œλ ˆκ°€ λ˜μ–΄λ²„λ¦¬λ©°, 단지 λͺ¨μŠ΅ 뿐만 μ•„λ‹ˆλΌ κ·Έκ°€ μΈκ°„μœΌλ‘œμ¨ μ§€μΌœμ™”λ˜ λͺ¨λ“  것듀을 ν•¨κ»˜ μžƒμ–΄λ²„λ¦¬κ²Œ λœλ‹€. 이후 가쑱듀은 κ·Έλ₯Ό μ±™κΈ°λ €λŠ” λͺ¨μŠ΅μ„ λ³΄μ΄κΈ°λŠ” ν•˜μ§€λ§Œ, κ²°κ΅­ κ°€μ‘±λ“€μ—κ²Œ κ·ΈλŠ” 인간이 μ•„λ‹Œ 벌레둜 ν‰κ°€λ˜μ–΄ λ²„λ¦Όλ°›μ•˜μœΌλ©°, μ΅œμ’…μ μœΌλ‘œλŠ” μ“Έμ“Ένžˆ μ£½μŒμ„ λ§žμ΄ν•œλ‹€. 경제적 λŠ₯λ ₯을 μƒμ‹€ν•œ ν•œ λͺ…μ˜ 인간이 κ°€μ •μ΄λ‚˜ μ‚¬νšŒμ—μ„œ λ²„λ¦Όλ°›κ²Œ λœλ‹€λŠ” μ”μ“Έν•œ 메세지λ₯Ό λ˜μ§€λŠ” μ†Œμ„€μΈλ°, 이 μ±…μ˜ μž‘κ°€λŠ” unsafeCoerce νƒ€μž…μ„ β€œνƒ€μž… 역할을 μ œλŒ€λ‘œ λͺ» ν•˜λŠ” νƒ€μž…β€μœΌλ‘œ 바라보고 있기 λ•Œλ¬Έμ— 이런 μ˜ˆμ‹œλ₯Ό λ“  것은 μ•„λ‹κΉŒ? ν•˜λŠ” 생각을 ν•΄λ³Έλ‹€.

    ν”νžˆ 듀을 수 μžˆλŠ” 또 λ‹€λ₯Έ μ£Όμž₯은 μ΄λŸ¬ν•œ νƒ€μž… μ²˜λ¦¬λ“€μ΄ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ λ„ˆλ¬΄ λ§Žμ€ 뢀담을 μ§€μš΄λ‹€λŠ” 것이닀. λ¬Όλ‘  C++μ—μ„œ μ΄ν„°λ ˆμ΄ν„° 선언을 λͺ‡ 번 해보고 λ‚œ λ’€μ—λŠ” μ΄λŸ¬ν•œ λ§ˆμŒμ— μ–΄λŠ 정도 곡감할 수 μžˆμ—ˆλ‹€. κ·ΈλŸ¬λ‚˜ 사싀 μ»΄νŒŒμΌλŸ¬κ°€ λ¬Έλ§₯을 톡해 λŒ€λΆ€λΆ„μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλŠ” νƒ€μž… μΆ”λ‘  기술이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, C++μ—μ„œλŠ” λ³€μˆ˜λ₯Ό auto둜 μ„ μ–Έν•˜λ”λΌλ„ 이 λ³€μˆ˜μ˜ νƒ€μž…μ΄ 무엇인지 μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ κ²°μ •ν•  수 μžˆλ‹€.

    Haskell을 μ‚¬μš©ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ 경우, νƒ€μž… 선언은 선택 사항이닀. ν•˜μ§€λ§Œ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ 직접 νƒ€μž… 선언을 ν•˜λŠ” κ²½μš°κ°€ λ§Žμ€λ°, μ΄λŸ¬ν•œ 선언듀이 μ½”λ“œμ˜ μ˜λ―Έμ— λŒ€ν•œ λ§Žμ€ 정보λ₯Ό μ•Œλ €μ£ΌκΈ°λ„ ν•˜κ³  컴파일 였λ₯˜λ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ£ΌκΈ°λ„ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 사싀 Haskell을 μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜λŠ” κ²½μš°μ—λŠ” νƒ€μž…λΆ€ν„° μ„€κ³„ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€. 섀계 μ΄ν›„μ—λŠ” νƒ€μž… μ„ μ–Έλ“€λ‘œλΆ€ν„° μ μ§„μ μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜κ²Œ λœλ‹€.

    μ’…μ’… κ°•λ ₯ν•œ 정적 타이핑은 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜μ§€ μ•ŠλŠ” ν•‘κ³„λ‘œλ„ μ‚¬μš©λœλ‹€. κ°„ν˜Ή Haskell ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ β€œμ»΄νŒŒμΌλœλ‹€λ©΄ 이건 μ œλŒ€λ‘œ 된 ν”„λ‘œκ·Έλž¨μ΄λ‹€β€λΌκ³  μ΄μ•ΌκΈ°ν•˜λŠ” 것을 듀을 수 μžˆλ‹€. ν•˜μ§€λ§Œ λ‹Ήμ—°ν•˜κ²Œλ„ μ œλŒ€λ‘œ νƒ€μ΄ν•‘λœ ν”„λ‘œκ·Έλž¨μ΄λΌκ³  ν•΄μ„œ λ°˜λ“œμ‹œ μ œλŒ€λ‘œλœ ν”„λ‘œκ·Έλž¨μ΄λΌκ³  보μž₯ν•  μˆ˜λŠ” μ—†λ‹€.

    이런 κ²½μ†”ν•œ νƒœλ„λ“€μ€ μ—¬λŸ¬ μ—°κ΅¬λ“€μ—μ„œ 생각보닀 Haskell이 μ½”λ“œ ν’ˆμ§ˆ μΈ‘λ©΄μ—μ„œ κ°•λ ₯ν•œ μ„±κ³Όλ₯Ό 내지 λͺ»ν•œλ‹€λŠ” 사싀과도 이어진닀. 상업적인 ν™˜κ²½μ—μ„œλŠ” λ°˜λ“œμ‹œ 졜고의 ν’ˆμ§ˆμ„ λ§Œλ“€μ–΄ λ‚΄μ•Όν•œλ‹€κΈ°λ³΄λ‹€λŠ” μΌμ •ν•œ ν’ˆμ§ˆ μˆ˜μ€€λ§Œ λ§Œμ‘±μ‹œν‚€λŠ” 것이 λ‚˜μ„ μˆ˜λ„ μžˆλ‹€. 이런 μ „λž΅ μ„ νƒμ˜ νŒ©ν„°λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발의 경제적인 μΈ‘λ©΄, 그리고 μ΅œμ’… μ‚¬μš©μžμ˜ ν’ˆμ§ˆ ν—ˆμš© μˆ˜μ€€κ³Ό λ°€μ ‘ν•œ 관련이 있으며, 사싀 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‚˜ 기술적 λ°©λ²•λ‘ κ³ΌλŠ” 거의 관련이 μ—†λ‹€.

    이런 ν™˜κ²½μ—μ„œ κ°€μž₯ μš°μ„ μ‹œ λ˜μ–΄μ•Ό ν•˜λŠ” ν’ˆμ§ˆ 기쀀은 μ–Όλ§ˆλ‚˜ λ§Žμ€ ν”„λ‘œμ νŠΈκ°€ 일정이 λ°€λ ΈλŠ”μ§€, 그리고 μ›ν•˜λŠ” κΈ°λŠ₯을 μ œλŒ€λ‘œ λ§Œμ‘±μ‹œν‚€μ§€ λͺ»ν•œ μƒνƒœλ‘œ μ‚¬μš©μžμ—κ²Œ μ „λ‹¬λ˜λŠ”μ§€λ₯Ό μΈ‘μ •ν•˜λŠ” 것이닀.

    λ˜ν•œ μœ λ‹› ν…ŒμŠ€νŠΈκ°€ κ°•νƒ€μž… μ‹œμŠ€ν…œμ„ λŒ€μ²΄ν•  수 μžˆλ‹€λŠ” μ£Όμž₯도 μžˆλ‹€. ν•œλ²ˆ κ°•νƒ€μž… μ‹œμŠ€ν…œμ„ 가진 μ–Έμ–΄μ—μ„œ νŠΉμ • ν•¨μˆ˜κ°€ 가진 인수의 νƒ€μž…μ„ λ³€κ²½ν•˜λŠ” 일반적인 λ¦¬νŒ©ν† λ§ μž‘μ—…μ„ μƒκ°ν•΄λ³΄μž.

    μ•½νƒ€μž… μ‹œμŠ€ν…œ μ–Έμ–΄μ—μ„œλŠ” 이제 이 ν•¨μˆ˜κ°€ λ‹€λ₯Έ νƒ€μž…μ˜ 데이터λ₯Ό κΈ°λŒ€ν•œλ‹€λŠ” 사싀이 ν˜ΈμΆœλΆ€μ— 전달이 λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆκ² μ§€λ§Œ, κ°•νƒ€μž… μ‹œμŠ€ν…œ μ–Έμ–΄μ—μ„œλŠ” ν•΄λ‹Ή ν•¨μˆ˜μ˜ 선언을 μˆ˜μ •ν•˜κ³  이후 νŒŒμƒλœ λΉŒλ“œ 였λ₯˜λ“€μ„ μˆ˜μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν•  것이닀.

    ν•˜μ§€λ§Œ κ²°κ΅­ ν…ŒμŠ€νŠΈλΌλŠ” 것은 ν™•λ₯ μ μΈ μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— 증λͺ…μ΄λΌλŠ” κ°œλ…μ„ λŒ€μ²΄ν•˜κΈ°μ—λŠ” 역뢀쑱이며, μœ λ‹› ν…ŒμŠ€νŠΈλ‘œ λͺ‡λͺ‡ κ΅¬ν˜„μ˜ 뢈일치λ₯Ό μž‘μ•„λ‚΄λŠ” 정도일 것이닀.

    2.3 νƒ€μž…μ΄λž€ 무엇인가?

    νƒ€μž…μ„ κ°€μž₯ κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜λŠ” 말은 λ°”λ‘œ 집합이닀. Bool νƒ€μž…μ€ True와 False 2개의 μ›μ†Œλ‘œ 이루어진 집합이며, Char νƒ€μž…μ€ aλ‚˜ ą와 같은 λͺ¨λ“  μœ λ‹ˆμ½”λ“œ 문자λ₯Ό μ›μ†Œλ‘œ 가진 집합이닀.

    집합은 μœ ν•œν•  μˆ˜λ„ 있고 λ¬΄ν•œν•  μˆ˜λ„ μžˆλ‹€. Char의 λ¦¬μŠ€νŠΈμ™€ λ™μΌν•œ 의미인 String νƒ€μž…μ˜ κ²½μš°κ°€ λ°”λ‘œ λ¬΄ν•œμ§‘ν•©μ˜ μ˜ˆμ΄λ‹€.

    ν•œλ²ˆ xλΌλŠ” λ³€μˆ˜λ₯Ό Integer νƒ€μž…μœΌλ‘œ 선언해보도둝 ν•˜μž.

    x :: Integer

    μš°λ¦¬λŠ” 이제 이 xλΌλŠ” 값이 μ •μˆ˜ 집합에 λ“€μ–΄μžˆλŠ” ν•˜λ‚˜μ˜ μ›μ†ŒλΌκ³  이야기할 수 μžˆλ‹€. Haskellμ—μ„œ Integer νƒ€μž…μ€ μž„μ˜ 정밀도 μ‚°μˆ μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ¬΄ν•œν•œ 집합이닀. C++의 int와 같이 μ›μ‹œ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” μœ ν•œμ§‘ν•© Int도 μ‘΄μž¬ν•œλ‹€.

    λ¬Όλ‘  νƒ€μž…κ³Ό 집합을 μ™„μ „νžˆ λ™μΌμ‹œ ν•˜κΈ°μ—λŠ” μž¬κ·€μ μΈ μ •μ˜λ₯Ό ν¬ν•¨ν•˜λŠ” λ‹€ν˜•μ„± ν•¨μˆ˜λ‚˜ λͺ¨λ“  집합을 μ›μ†Œλ‘œ κ°€μ§€λŠ” 집합을 μ •μ˜ν•  수 μ—†λ‹€λŠ” λ“±μ˜ λͺ‡ 가지 λ¬Έμ œκ°€ μžˆκΈ°λŠ” ν•˜μ§€λ§Œ, μ•žμ„œ μ΄μ•ΌκΈ°ν•œλŒ€λ‘œ λ„ˆλ¬΄ μ—„κ²©ν•œ μˆ˜ν•™μ μΈ μ •μ˜λ₯Ό μ΄μ•ΌκΈ°ν•˜μ§€λŠ” μ•Šκ² λ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 β€œSet”이라고 λΆˆλ¦¬λŠ” μ§‘ν•©λ“€μ˜ μΉ΄ν…Œκ³ λ¦¬κ°€ μ‘΄μž¬ν•˜λ©° μš°λ¦¬κ°€ μ•žμœΌλ‘œ 이 κ°œλ…μ„ λ‹€λ£° κ²ƒμ΄λΌλŠ” 점이닀. 이 Set μΉ΄ν…Œκ³ λ¦¬μ—μ„œ λŒ€μƒμ€ 집합이고 사상(ν™”μ‚΄ν‘œ)λŠ” ν•¨μˆ˜μ΄λ‹€.

    Set은 맀우 νŠΉλ³„ν•œ μΉ΄ν…Œκ³ λ¦¬μ΄λ‹€. μ™œλƒν•˜λ©΄ μš°λ¦¬λŠ” 이미 이 μΉ΄ν…Œκ³ λ¦¬μ˜ λŒ€μƒμΈ 집합에 λŒ€ν•΄μ„œ 잘 μ•Œκ³  μžˆμœΌλ‹ˆ μ΄λ‘œλΆ€ν„° λ§Žμ€ 직관을 얻을 수 있기 λ•Œλ¬Έμ΄λ‹€. 예λ₯Ό λ“€μ–΄ μš°λ¦¬λŠ” 이미 κ³΅μ§‘ν•©μ΄λΌλŠ” 것이 μ–΄λ– ν•œ μ›μ†Œλ„ 가지고 μžˆμ§€ μ•Šλ‹€λŠ” 사싀을 μ•Œκ³  μžˆλ‹€. λ˜ν•œ νŠΉλ³„ν•œ ν•˜λ‚˜μ˜ μ›μ†Œλ₯Ό 가진 집합도 μ•Œκ³  있으며, ν•¨μˆ˜λΌλŠ” 것이 μ–΄λ–€ ν•œ μ§‘ν•©μ˜ μ›μ†Œλ₯Ό λ‹€λ₯Έ μ§‘ν•©μ˜ μ›μ†Œμ™€ 맀핑(Mapping)ν•΄μ£ΌλŠ” κ°œλ…μ΄λΌλŠ” 것도 μ•Œκ³  μžˆλ‹€.

    λ˜ν•œ ν•¨μˆ˜κ°€ 두 개의 μ›μ†Œλ₯Ό ν•˜λ‚˜μ˜ μ›μ†Œλ‘œ 맀핑할 μˆ˜λŠ” μžˆμ§€λ§Œ, λ°˜λŒ€λ‘œ ν•˜λ‚˜μ˜ μ›μ†Œλ₯Ό 두 개의 μ›μ†Œλ‘œ 맀핑할 μˆ˜λŠ” μ—†λ‹€λŠ” 것도 μ•Œκ³  μžˆλ‹€. 그리고 μš°λ¦¬λŠ” ν•­λ“± ν•¨μˆ˜κ°€ μ§‘ν•©μ˜ 각 μ›μ†Œλ₯Ό 자기 μžμ‹ μ—κ²Œ λ§€ν•‘ν•œλ‹€λŠ” 것을 μ•Œκ³  μžˆλ‹€. 이제 우리의 λͺ©ν‘œλŠ” μ΄λ ‡κ²Œ λ””ν…ŒμΌν•œ κ°œλ…λ“€μ€ 점점 μžŠμ–΄λ²„λ¦¬κ³  μˆœμˆ˜ν•œ μΉ΄ν…Œκ³ λ¦¬ 이둠의 μš©μ–΄, 즉 λŒ€μƒκ³Ό ν™”μ‚΄ν‘œλ§ŒμœΌλ‘œ 이런 κ°œλ…λ“€μ„ μΆ”μƒν™”ν•΄μ„œ μ΄ν•΄ν•˜λŠ” 것이닀.

    이상적인 μƒν™©μ—μ„œ μš°λ¦¬λŠ” Haskell의 νƒ€μž…μ„ μ§‘ν•©μœΌλ‘œ, Haskell의 ν•¨μˆ˜λŠ” 집합 κ°„μ˜ μˆ˜ν•™μ μΈ ν•¨μˆ˜λ‘œ μ •μ˜ν•΄λ³Ό 수 μžˆμ„ 것이닀. ν•˜μ§€λ§Œ ν•œ 가지 λ¬Έμ œκ°€ μžˆλ‹€. λ°”λ‘œ μˆ˜ν•™μ μΈ ν•¨μˆ˜λŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, λ‹¨μˆœνžˆ 닡을 μ•Œκ³  μžˆλŠ” 좔상적 κ°œλ…μ΄λΌλŠ” 것이닀. ν•˜μ§€λ§Œ Haskell의 ν•¨μˆ˜λŠ” 직접 닡을 κ³„μ‚°ν•΄μ•Όν•œλ‹€. λ¬Όλ‘  μœ ν•œν•œ 계산단계 λ‚΄μ—μ„œ 닡을 μ–»μ–΄λ‚Ό 수만 μžˆλ‹€λ©΄ 계산이 μ–Όλ§ˆλ‚˜ λ³΅μž‘ν•˜λ˜ 이 차이가 λ”±νžˆ 문제둜 λ²ˆμ§€μ§€λŠ” μ•ŠλŠ”λ‹€. (λ¬Όλ‘  λ„ˆλ¬΄ 큰 수λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ λ¬Έμ œκ°€ 될 μˆ˜λ„ μžˆμ§€λ§Œ 말이닀.)

    ν•˜μ§€λ§Œ μž¬κ·€μ™€ 같은 일뢀 계산은 μ˜μ›νžˆ μ’…λ£Œλ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ’…λ£Œλ˜λŠ” ν•¨μˆ˜μ™€ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό κ΅¬λΆ„ν•˜λŠ” 것은 정지 λ¬Έμ œλΌλŠ” 유λͺ…ν•œ λ‚œμ œμ΄κΈ° λ•Œλ¬Έμ—, Haskell λ‚΄μ—μ„œ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ§Œ μ°Ύμ•„λ‚΄μ–΄ κΈˆμ§€ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€. κ·Έλž˜μ„œ 컴퓨터 κ³Όν•™μžλ“€μ€ 관점에 따라 ν›Œλ₯­ν•œ 아이디어 λ˜λŠ” HackμœΌλ‘œλ„ λ³Ό 수 μžˆλŠ” bottomμ΄λΌλŠ” ν•œ 가지 νŠΉλ³„ν•œ 값을 μ œμ•ˆν–ˆλ‹€.

    이 β€œκ°’β€μ€ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” 연산을 ν‘œν˜„ν•˜λ©°, _|_ λ˜λŠ” μœ λ‹ˆμ½”λ“œ βŠ₯λ‘œλ„ ν‘œν˜„ν•  수 μžˆλ‹€. ν•œλ²ˆ μ˜ˆμ‹œλ₯Ό 보자.

    f :: Bool -> Bool

    μœ„ ν•¨μˆ˜λŠ” True, False λ˜λŠ” _|_ λ₯Ό λ°˜ν™˜ν•˜λ©°, 이것은 이 ν•¨μˆ˜κ°€ μ’…λ£Œλ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€λŠ” 사싀을 μ˜λ―Έν•œλ‹€.

    μž¬λ―ΈμžˆλŠ” 사싀은 bottom을 νƒ€μž… μ‹œμŠ€ν…œμ˜ μΌλΆ€λ‘œ λ°›μ•„λ“€μ΄κΈ°λ§Œ ν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ—μ„œ λ°œμƒν•˜λŠ” λͺ¨λ“  λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό bottom으둜 ν‘œν˜„ν•˜κ³  λͺ…μ‹œμ μœΌλ‘œ ν•¨μˆ˜κ°€ bottom을 λ°˜ν™˜ν•  수 μžˆλ‹€λŠ” κ°œλ…λ§ŒμœΌλ‘œλ„ μ—„μ²­λ‚œ νŽΈμ˜μ„±μ΄ μƒκΈ΄λ‹€λŠ” 것이닀. μ΄λŠ” undefinedλ₯Ό μ‚¬μš©ν•œ ν‘œν˜„μ—μ„œ 확인해볼 수 μžˆλ‹€.

    f :: Bool -> Bool
    f x = undefined

    μœ„ ν‘œν˜„μ—μ„œ undefinedλŠ” bottom으둜 ν‰κ°€λ˜κΈ° λ•Œλ¬Έμ— νƒ€μž… 체크λ₯Ό ν†΅κ³Όν•œλ‹€. bottom은 Bool을 ν¬ν•¨ν•œ λͺ¨λ“  νƒ€μž…μ˜ μ›μ†Œμ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 심지어 μ•„λž˜μ™€ 같이 μž‘μ„±ν•  μˆ˜λ„ μžˆλ‹€.

    f :: Bool -> Bool
    f = undefined
    -- (xλŠ” μƒλž΅ κ°€λŠ₯)

    이게 κ°€λŠ₯ν•œ μ΄μœ λŠ” bottom이 Bool -> Bool νƒ€μž…μ—λ„ ν•΄λ‹Ήν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 이처럼 bottom을 λ°˜ν™˜ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λΆ€λΆ„ ν•¨μˆ˜(Partial Function)이라고 ν•˜λ©°, λ°˜λŒ€λ‘œ λͺ¨λ“  μΈμˆ˜μ— λŒ€ν•΄ λ°˜λ“œμ‹œ μœ νš¨ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λŠ” 전체 ν•¨μˆ˜(Total Function)이라고 ν•œλ‹€.

    λ°”λ‘œ 이 bottomμ΄λΌλŠ” κ°œλ… λ•Œλ¬Έμ— Haskell의 νƒ€μž…κ³Ό ν•¨μˆ˜λ‘œ 이루어진 μΉ΄ν…Œκ³ λ¦¬λŠ” Set이 μ•„λ‹Œ HaskλΌλŠ” μ΄λ¦„μœΌλ‘œ λΆˆλ¦°λ‹€. ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ 이둠적으둜 계속 파고 듀닀보면 끝도 없이 λ³΅μž‘ν•΄μ§€κΈ°λ„ ν•˜κ³  μ–΄μ°¨ν”Ό μ‹€μš©μ μΈ μΈ‘λ©΄μ—μ„œ 보면 μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ™€ bottom을 κ·Έλƒ₯ λ¬΄μ‹œν•˜κ³  Haskλ₯Ό Set이라고 생각해도 λ¬΄λ°©ν•˜λ‹ˆ 이 μ΄μ•ΌκΈ°λŠ” μ΄μ―€μ—μ„œ λ§ˆλ¬΄λ¦¬μ§€μœΌλ €κ³  ν•œλ‹€.

    2.4 μš°λ¦¬λŠ” μ™œ μˆ˜ν•™μ μΈ κ°œλ…μ„ μ•Œμ•„μ•Ό ν•˜λŠ”κ°€?

    μ•„λ§ˆ μ—¬λŸ¬λΆ„μ€ ν”„λ‘œκ·Έλž˜λ¨Έλ‘œμ„œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ꡬ문과 문법에 λŒ€ν•΄ κΉŠμ€ 이해도λ₯Ό 가지고 μžˆμ„ 것이닀. μ–Έμ–΄μ˜ λ¬Έλ²•μ΄λ‚˜ ꡬ문과 같은 μš”μ†Œλ“€μ€ 보톡 μ–Έμ–΄ λͺ…μ„Έμ˜ κ°€μž₯ 첫 뢀뢄에 ν˜•μ‹μ μΈ ν‘œκΈ°λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€λͺ…λœλ‹€. κ·ΈλŸ¬λ‚˜ μ–Έμ–΄μ˜ 의미둠적인 뢀뢄은 μ„€λͺ…ν•˜κΈ°κ°€ 훨씬 κΉŒλ‹€λ‘­λ‹€. μ–Έμ–΄μ˜ μ˜λ―Έμ— λŒ€ν•œ μ„€λͺ…듀은 훨씬 더 λ§Žμ€ νŽ˜μ΄μ§€λ₯Ό ν•„μš”λ‘œ ν•˜κ³  ν˜•μ‹μ μ΄κΈ°λ„ μ–΄λ €μš°λ©°, λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—λŠ” μ„€λͺ…이 μ™„λ²½ν•˜κΈ°λ„ μ–΄λ ΅λ‹€. 이 λ•Œλ¬Έμ— 언어에 λŒ€ν•œ λ…Όμ˜λŠ” λλ‚˜μ§€ μ•Šκ³  μ–Έμ–΄ ν‘œμ€€μ— λŒ€ν•œ λ‚΄μš©μ— λŒ€ν•΄ 각자의 해석을 톡해 μ €μˆ ν•œ 책듀이 λ²”λžŒν•˜κ³  μžˆλŠ” 것이닀.

    λ¬Όλ‘  μ–Έμ–΄μ˜ 의미둠적인 츑면을 μ„€λͺ…ν•˜λŠ” ν˜•μ‹ν™”λœ λͺ‡λͺ‡ 도ꡬ듀이 μ‘΄μž¬ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ, μ›Œλ‚™ λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ— 주둜 λ‹¨μˆœν™”λœ ν•™μˆ μ μΈ μ–Έμ–΄μ—λ‚˜ μ‚¬μš©λ˜λŠ” 편이며 ν˜„μ‹€μ˜ κ±°λŒ€ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” 잘 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŸ¬ν•œ 도ꡬ 쀑 ν•˜λ‚˜μΈ 운용 의미둠(Operational Semantics)은 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ λ§€μ»€λ‹ˆμ¦˜μ„ κΈ°μˆ ν•˜λŠ”λ°, μ΄λŠ” ν˜•μ‹ν™”λœ 가상 인터프리터λ₯Ό μ •μ˜ν•˜λŠ” 것이닀. μ‚°μ—…μš© 언어인 C++와 같은 μ–Έμ–΄λ“€μ˜ κ²½μš°μ—λŠ” 보톡 β€œμΆ”μƒκΈ°κ³„(Abtract Machine)”와 같은 λΉ„ν˜•μ‹μ μΈ 운용 좔둠을 μ‚¬μš©ν•˜μ—¬ μ„€λͺ…ν•œλ‹€.

    λ¬Έμ œλŠ” μ΄λŸ¬ν•œ 운용 μ˜λ―Έλ‘ μ„ μ΄μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 증λͺ…을 ν•˜λŠ” 것이 ꡉμž₯히 μ–΄λ ΅λ‹€λŠ” 것이닀. μ–΄λ–€ ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ νŠΉμ§•μ„ 보여주기 μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ 가상 인터프리터λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ β€œμ‹€ν–‰β€μ‹œμΌœλ΄μ•Ό ν•œλ‹€.

    단지 ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ μ–΄λ–€ λ¬Έμ œμ— λŒ€ν•œ ν˜•μ‹μ μΈ 증λͺ…을 μˆ˜ν–‰ν•˜λŠ” 것에 λŒ€ν•΄ μ΅μˆ™ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ–΄λ ΅λ‹€κ³  ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. μš°λ¦¬λŠ” 항상 μš°λ¦¬κ°€ μ˜¬λ°”λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κ³  μžˆλ‹€κ³  β€œμƒκ°β€ν•œλ‹€. 아무도 ν‚€λ³΄λ“œ μ•žμ— μ•‰μ•„μ„œ β€œμΌλ‹¨ λŒ€μΆ© λͺ‡ 쀄 짜보고 무슨 일이 λ²Œμ–΄μ§€λŠ”μ§€ 봐야지”라고 λ§ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€λŠ” 것이닀. μš°λ¦¬λŠ” μš°λ¦¬κ°€ μž‘μ„±ν•˜λŠ” μ½”λ“œλ“€μ΄ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 얻을 수 μžˆλ„λ‘ νŠΉμ •ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•  것이라고 κΈ°λŒ€ν•˜λŠ” 것이닀. κ·Έλž˜μ„œ μž‘μ„±ν•œ μ½”λ“œκ°€ 우리의 μ˜ˆμƒκ³Ό λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ©΄ μš°λ¦¬λŠ” 크게 λ†€λΌκ²Œ λœλ‹€.

    즉, μš°λ¦¬λŠ” μš°λ¦¬κ°€ μž‘μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ— λŒ€ν•œ μΌμ’…μ˜ 이성적 좔둠을 ν•˜κ³  있으며, μ΄λŸ¬ν•œ 좔둠은 우리의 λ¨Έλ¦Ώμ†μ˜ 인터프리터λ₯Ό 톡해 μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌœλ³΄λ©° μˆ˜ν–‰ν•˜κ³  μžˆλ‹€λŠ” 것이닀. ν•˜μ§€λ§Œ μš°λ¦¬κ°€ λͺ¨λ“  λ³€μˆ˜λ₯Ό μΆ”μ ν•œλ‹€λŠ” 것은 λΆˆκ°€λŠ₯에 가깝닀. μ»΄ν“¨ν„°λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 것에 νŠΉν™”λ˜μ–΄μžˆλŠ” λ…€μ„μ΄μ§€λ§Œ 우리 인간은 그렇지 μ•ŠμœΌλ‹ˆ 말이닀! λ§Œμ•½ μš°λ¦¬κ°€ μ»΄ν“¨ν„°λ§ŒνΌ ν”„λ‘œκ·Έλž¨μ„ 잘 μ‹€ν–‰μ‹œν‚¬ 수 μžˆμ—ˆλ‹€λ©΄ μ»΄ν“¨ν„°λΌλŠ” κ°œλ… μžμ²΄κ°€ ν•„μš”μ—†μ—ˆμ„ν…Œλ‹ˆ 말이닀.

    이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν‘œμ‹œμ  의미둠(Denotational Semantics)라고 λΆˆλ¦¬λŠ” λŒ€μ•ˆμ΄ μžˆλ‹€. μ΄λŠ” μˆ˜ν•™μ„ 기반으둜 ν•˜λ©°, ν‘œμ‹œμ  μ˜λ―Έλ‘ μ—μ„œλŠ” λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° ꡬ성에 μˆ˜ν•™μ  해석이 λΆ€μ—¬λ˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ˜ 속성을 증λͺ…ν•˜λ €λ©΄ κ·Έμ € μˆ˜ν•™μ  정리λ₯Ό 증λͺ…ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 이런 μˆ˜ν•™μ μΈ 증λͺ…이 μ–΄λ €μšΈ 것이라고 생각할 μˆ˜λŠ” μžˆκ² μ§€λ§Œ, 사싀 우리 인간은 μ§€λ‚œ μˆ˜μ²œλ…„λ™μ•ˆ μˆ˜ν•™μ  κΈ°μˆ λ“€μ„ λ°œμ „μ‹œμΌœμ™”κΈ° λ•Œλ¬Έμ—, 이미 μš°λ¦¬κ°€ ν™œμš©ν•  수 μžˆλŠ” λ§Žμ€ 지식듀이 μŒ“μ—¬μžˆλ‹€. λ˜ν•œ μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ§ˆμ£ΌμΉ˜λŠ” λ¬Έμ œλ“€μ€ 전문적인 μˆ˜ν•™μžλ“€μ΄ 증λͺ…ν•΄μ•Όν•˜λŠ” λ¬Έμ œλ“€μ— λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ κ°„λ‹¨ν•œ κ²½μš°κ°€ λ§Žλ‹€.

    ν‘œμ‹œμ  μ˜λ―Έλ‘ μ„ μ•„μ£Ό 잘 ν‘œν˜„ν•  수 μžˆλŠ” Haskellμ—μ„œμ˜ νŒ©ν† λ¦¬μ–Ό ν•¨μˆ˜ μ •μ˜λ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

    fact n = product [1..n]

    [1..n] ν‘œν˜„μ‹μ€ 1λΆ€ν„° nκΉŒμ§€μ˜ μ •μˆ˜λ‘œ 이루어진 리슀트λ₯Ό μ˜λ―Έν•œλ‹€. ν•¨μˆ˜ productλŠ” 이 리슀트의 λͺ¨λ“  μ›μ†Œλ₯Ό κ³±ν•œλ‹€. 이런 ν‘œν˜„λ“€μ€ μš°λ¦¬κ°€ μˆ˜ν•™ κ΅κ³Όμ„œμ—μ„œ λ³Ό 수 μžˆλŠ” νŒ©ν† λ¦¬μ–Όμ˜ μ •μ˜μ™€ ꡉμž₯히 μœ μ‚¬ν•˜λ‹€. ν•œλ²ˆ C와 λΉ„κ΅ν•΄λ³΄μž.

    int fact(int n) {
        int i;
        int result = 1;
        for (i = 2; i <= n; ++i)
            result *= i;
        return result;
    }

    μ„€λͺ…이 더 ν•„μš”ν• κΉŒ?

    사싀 νŒ©ν† λ¦¬μ–Ό ν•¨μˆ˜μ—λŠ” 이미 λͺ…λ°±ν•œ μˆ˜ν•™μ  ν‘œν˜„μ΄ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 살짝 λΉ„κ²ν•œ μ˜ˆμ‹œμ΄κΈ°λŠ” ν•˜λ‹€. μ—¬κΈ°μ„œ μ˜λ¦¬ν•œ λ…μžλΌλ©΄ β€œκ·ΈλŸΌ ν‚€λ³΄λ“œμ—μ„œ 문자λ₯Ό μ½κ±°λ‚˜ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 νŒ¨ν‚·μ„ λ³΄λ‚΄λŠ” ν–‰μœ„λ“€μ— λŒ€ν•œ μˆ˜ν•™μ  λͺ¨λΈμ€ λ­”κ°€μš”?”라고 λ¬Όμ–΄λ³Ό μˆ˜λ„ μžˆκ² λ‹€. λ‚˜λ„ 였랜 κΈ°κ°„ κ³ λ―Όν•΄λ΄€μ§€λ§Œ 이런 μ§ˆλ¬Έλ“€μ€ 자칫 λ‚œν•΄ν•œ μ„€λͺ…을 ν•˜κ²Œ 되기 μ‰¬μš΄ κΉŒλ‹€λ‘œμš΄ μ§ˆλ¬Έμ΄μ—ˆλ‹€.

    λ¬Όλ‘  질문과 같이 μ€‘μš”ν•œ μž‘μ—…λ“€μ„ 운용 의미둠으둜 λ‹€λ£¨κΈ°λŠ” μ‰½μ§€λ§Œ ν‘œμ‹œμ  의미둠으둜 λ‹€λ£¨κΈ°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šμ•„λ³΄μΈλ‹€λŠ” 것은 μΈμ •ν•œλ‹€. 이런 λ¬Έμ œμ— λŒ€ν•œ λŒνŒŒκ΅¬λŠ” λ°”λ‘œ μΉ΄ν…Œκ³ λ¦¬ μ΄λ‘ μ—μ„œ λ‚˜μ™”λ‹€. Eugenio MoggiλŠ” κ³„μ‚°μ—μ„œ νŒŒμƒλœ 효과(Computational Effect)λ₯Ό λͺ¨λ‚˜λ“œμ— 맀핑할 수 μžˆλ‹€λŠ” 사싀을 λ°œκ²¬ν–ˆλŠ”λ°, μ΄λŠ” ν‘œμ‹œμ  μ˜λ―Έλ‘ μ— μƒˆλ‘œμš΄ 생λͺ…을 λΆˆμ–΄λ„£μ–΄ μ£Όμ—ˆκ³  순수 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž¨μ„ 더 μœ μš©ν•˜κ²Œ λ§Œλ“€ 뿐 μ•„λ‹ˆλΌ 전톡적인 ν”„λ‘œκ·Έλž˜λ°μ—λ„ μƒˆλ‘œμš΄ μ‹œκ°μ„ μ œκ³΅ν•΄μ£Όμ—ˆλ‹€. μΆ”ν›„ λͺ¨λ‚˜λ“œμ— λŒ€ν•΄μ„œλŠ” μΉ΄ν…Œκ³ λ¦¬λ‘ μ μΈ 도ꡬ듀에 μ’€ 더 μ΅μˆ™ν•΄μ§€κ³ λ‚œ λ’€ λ‹€μ‹œ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² λ‹€.

    μ •λ¦¬ν•˜μžλ©΄ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μˆ˜ν•™μ  λͺ¨λΈμ΄ κ°€μ§€λŠ” μ€‘μš”ν•œ μž₯점 쀑 ν•˜λ‚˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ˜ 정확성에 λŒ€ν•œ ν˜•μ‹μ μΈ 증λͺ…을 μˆ˜ν–‰ν•  수 μžˆλ‹€λŠ” 것이닀. 일상 μ†μ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μž‘μ„±ν•  λ•ŒλŠ” κ·Έλ ‡κ²Œ μ€‘μš”ν•˜μ§€ μ•Šμ„ 수 μžˆκ² μ§€λ§Œ, μž‘μ€ μ‹€νŒ¨ ν•˜λ‚˜κ°€ 큰 λŒ€κ°€λ‘œ λŒμ•„μ˜€λŠ” ν”„λ‘œκ·Έλž˜λ° λΆ„μ•Όλ‚˜ 심지어 μ‚¬λžŒμ˜ λͺ©μˆ¨μ΄ μœ„ν—˜ν•΄μ§ˆ 수 μžˆλŠ” 뢄야도 μžˆλ‹€. λ§Œμ•½ μ—¬λŸ¬λΆ„μ΄ 의료 μ‹œμŠ€ν…œμ„ μœ„ν•œ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μž‘μ„±ν•œλ‹€λ©΄ Haskell ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ œκ³΅ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜κ³Ό ν•¨μˆ˜λ“€μ΄ ν”„λ‘œκ·Έλž¨μ˜ 정확성을 보μž₯ν•΄μ€€λ‹€λŠ” 사싀에 κ°μ‚¬ν•˜κ²Œ 될 μˆ˜λ„ μžˆλ‹€.

    2.5 μˆœμˆ˜ν•¨μˆ˜μ™€ μˆœμˆ˜ν•˜μ§€μ•Šμ€ ν•¨μˆ˜

    μš°λ¦¬κ°€ C++ λ˜λŠ” λ‹€λ₯Έ λͺ…λ Ήν˜• μ–Έμ–΄μ—μ„œ ν•¨μˆ˜λΌκ³  λΆ€λ₯΄λŠ” 것듀은 μˆ˜ν•™μžλ“€μ΄ ν•¨μˆ˜λΌκ³  λΆ€λ₯΄λŠ” κ²ƒκ³ΌλŠ” μ•½κ°„ λ‹€λ₯Έ κ°œλ…μ΄λ‹€. μˆ˜ν•™μ  ν•¨μˆ˜λŠ” κ·Έμ € μ–΄λ– ν•œ κ°’λ“€ κ°„μ˜ 사상(Mapping)일 뿐이기 λ•Œλ¬Έμ΄λ‹€.

    λ¬Όλ‘  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜ν•™μ μΈ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜λŠ” 주어진 μž…λ ₯ 값을 λ°›μ•„ 좜λ ₯ 값을 κ³„μ‚°ν•œλ‹€. μ–΄λ– ν•œ 수의 μ œκ³±μ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜λŠ” 받아듀인 μž…λ ₯ 값을 κ·Έ μž…λ ₯ κ°’κ³Ό λ‹€μ‹œ κ³±ν•˜μ—¬ κ³„μ‚°ν•˜κ³  λ°˜ν™˜ν•  것이닀. 이 ν•¨μˆ˜λŠ” λ™μΌν•œ μž…λ ₯ 값을 λ°›μ•„ 호좜될 λ•Œλ§ˆλ‹€ 항상 같은 좜λ ₯ 값을 보μž₯ν•œλ‹€. μ–΄λ– ν•œ 수의 μ œκ³±μ΄λΌλŠ” 것은 λ‹¬μ˜ μœ„μƒμ²˜λŸΌ 맀번 λ³€ν•˜λŠ” κ°œλ…μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

    λ˜ν•œ μ–΄λ– ν•œ 수의 μ œκ³±μ„ κ³„μ‚°ν•˜λŠ” 일이 κ°•μ•„μ§€μ—κ²Œ λ§›μžˆλŠ” 간식을 μ£ΌλŠ” 것과 같은 μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ₯Ό 가지면 μ•ˆλœλ‹€. 이런 β€œν•¨μˆ˜β€λŠ” μˆ˜ν•™μ  ν•¨μˆ˜λ‘œ λͺ¨λΈλ§ν•˜κΈ°κ°€ 쉽지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

    이처럼 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ™μΌν•œ μž…λ ₯ 값이 μ£Όμ–΄μ§ˆ λ•Œ 항상 λ™μΌν•œ κ²°κ³Όλ₯Ό μƒμ„±ν•˜κ³  ν•¨μˆ˜ 외뢀세계에 영ν–₯을 λΌμΉ˜λŠ” μ‚¬μ΄λ“œμ΄νŽ™νŠΈκ°€ μ—†λŠ” ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜λΌκ³  ν•œλ‹€. Haskellκ³Ό 같은 순수 ν•¨μˆ˜ν˜• μ–Έμ–΄μ—μ„œλŠ” λͺ¨λ“  ν•¨μˆ˜κ°€ μˆœμˆ˜ν•˜κΈ° λ•Œλ¬Έμ—, λͺ…λ Ήν˜• 언어에 λΉ„ν•΄ ν‘œμ‹œμ  μ˜λ―Έλ‘ μ΄λ‚˜ μΉ΄ν…Œκ³ λ¦¬ 이둠을 μ‚¬μš©ν•˜μ—¬ λͺ¨λΈλ§ν•˜λŠ” 것이 μƒλŒ€μ μœΌλ‘œ 더 쉽닀. λ¬Όλ‘  λ‹€λ₯Έ 언어듀을 μ‚¬μš©ν•˜λ”λΌλ„ μˆœμˆ˜ν•œ 뢀뢄을 μ œν•œν•˜κ±°λ‚˜ μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ₯Ό λ³„λ„λ‘œ λ‹€λ£° 수 μžˆλ„λ‘ λ§Œλ“œλŠ” 것이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ μˆ˜ν•™μ  ν•¨μˆ˜λ§Œ μ‚¬μš©ν•œλ‹€λŠ” μ œμ•½μ΄ μš°λ¦¬μ—κ²Œ μ–΄λ– ν•œ λΆˆμ΄μ΅μ„ κ°€μ Έλ‹€μ£ΌλŠ” 일은 없을 것이며, μΆ”ν›„ λͺ¨λ‚˜λ“œκ°€ μ–΄λ–€ λ°©μ‹μœΌλ‘œ 순수 ν•¨μˆ˜λ§Œμ„ μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ’…λ₯˜μ˜ νš¨κ³Όλ“€μ„ λͺ¨λΈλ§ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£ΌλŠ”μ§€λ„ μ•Œμ•„λ³Ό 것이닀.

    2.6 νƒ€μž…μ— λŒ€ν•œ μ˜ˆμ‹œ

    νƒ€μž…μ΄ 사싀은 μ§‘ν•©μ΄λΌλŠ” 사싀을 κΉ¨λ‹«κ³  λ‚˜λ©΄, 이제 μš°λ¦¬λŠ” μ•½κ°„ λ…νŠΉν•œ νƒ€μž…μ— λŒ€ν•΄μ„œλ„ ν•œλ²ˆ 생각해볼 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 곡집합에 ν•΄λ‹Ήν•˜λŠ” νƒ€μž…μ€ λ¬΄μ—‡μΌκΉŒ? Haskellμ—μ„œλŠ” μ΄λŸ¬ν•œ νƒ€μž…μ„ Void라고 λΆ€λ₯΄κΈ°λŠ” ν•˜μ§€λ§Œ, C++μ—μ„œμ˜ voidμ™€λŠ” λ‹€λ₯Έ κ°œλ…μ΄λ‹€.

    이 νƒ€μž…μ€ μ–΄λ– ν•œ 값도 가지고 μžˆμ§€ μ•ŠλŠ” νƒ€μž…μ΄λ‹€. Voidλ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  μˆ˜λŠ” μžˆκ² μ§€λ§Œ 이λ₯Ό ν˜ΈμΆœν•  μˆ˜λŠ” 없을 것이닀. μ™œλƒν•˜λ©΄ 이런 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” Void νƒ€μž…μ˜ 값을 인자둜 λ„£μ–΄μ€˜μ•Ό ν•˜λŠ”λ°, 이 νƒ€μž…μ˜ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 이 ν•¨μˆ˜λŠ” μ–΄λ–€ νƒ€μž…μ΄λ“  λ°˜ν™˜ν•  수 있기 λ•Œλ¬Έμ— λ°˜ν™˜ν•  수 μžˆλŠ” 것듀에 λŒ€ν•œ μ œμ•½μ€ μ „ν˜€ μ—†κ² μ§€λ§Œ, κ²°κ΅­ ν˜ΈμΆœν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ­”κ°€κ°€ λ°˜ν™˜λ˜λŠ” 일도 λ²Œμ–΄μ§€μ§€ μ•Šμ„ 것이닀. 즉, 이 ν•¨μˆ˜λŠ” λ°˜ν™˜ νƒ€μž…μ— λŒ€ν•œ λ‹€ν˜•μ„±μ„ 가진 ν•¨μˆ˜λΌκ³  ν•  수 μžˆλ‹€.

    Haskell κ°œλ°œμžλ“€μ€ 이런 ν•¨μˆ˜λ₯Ό absurd라고 λΆ€λ₯Έλ‹€. μ—¬κΈ°μ„œ aλŠ” μ–΄λ–€ νƒ€μž…μ΄λ“ μ§€ 될 수 μžˆλŠ” νƒ€μž… λ³€μˆ˜λΌλŠ” 것을 κΈ°μ–΅ν•˜μž.

    absurd :: Void -> a

    이 ν•¨μˆ˜μ˜ 이름은 κ·Έλƒ₯ 지어진 것이 μ•„λ‹ˆλ‹€. Curry-Howard λ™ν˜•μ„±μ΄λΌλŠ” 논리학적인 μΈ‘λ©΄μ—μ„œ νƒ€μž…κ³Ό ν•¨μˆ˜λ₯Ό 더 깊게 해석해볼 수 μžˆλ‹€. Void νƒ€μž…μ€ 거짓을 λ‚˜νƒ€λ‚΄κ³ , absurd ν•¨μˆ˜μ˜ νƒ€μž…μ€ β€œκ±°μ§“μΈ κ°€μ •μ—μ„œ μ‹œμž‘λœ λͺ¨λ“  λͺ…μ œλŠ” μ°Έμ΄λ‹€β€λΌλŠ” λͺ…μ œμ— ν•΄λ‹Ήν•œλ‹€. μ΄λŠ” 라틴어 속담 β€œex falso sequitur quodlibet(λͺ¨λ“  것은 κ±°μ§“μœΌλ‘œλΆ€ν„° λ‚˜μ˜¨λ‹€)”과 같은 말이닀.

    πŸ’‘ μ—­μ£Ό

    μ΄λŠ” ν˜•μ‹λ…Όλ¦¬ν•™μ˜ κ°œλ…μΈλ°, Pβ†’Q(λ§Œμ•½ P라면 Q이닀)λΌλŠ” λͺ…μ œκ°€ μžˆλŠ” 경우, Pκ°€ 거짓이라 ν•  지라도 Qκ°€ 참이라면 전체 λͺ…μ œλŠ” 참으둜 ν‰κ°€λ°›λŠ” 것을 μ΄μ•ΌκΈ°ν•˜λŠ” 것이닀. λ§Œμ•½ Pκ°€ β€œν•˜λŠ˜μ΄ ν•˜μ–€μƒ‰μ΄λ‹€β€, Qκ°€ β€œνƒœμ–‘μ€ λœ¨κ²λ‹€β€λΌλ©΄ ν•˜λŠ˜μ΄ ν•˜μ–€μƒ‰μ΄λ“  μ•„λ‹ˆλ“  항상 νƒœμ–‘μ€ λœ¨κ±°μš°λ―€λ‘œ Pβ†’Q(ν•˜λŠ˜μ΄ ν•˜μ–€μƒ‰μ΄λ©΄ νƒœμ–‘μ€ λœ¨κ²λ‹€)도 참이 λœλ‹€.

    λ‹€μŒμœΌλ‘œλŠ” λ‹¨μΌμ›μ†Œ 집합에 ν•΄λ‹Ήν•˜λŠ” νƒ€μž…μ΄λ‹€. 이 νƒ€μž…μ€ 단 ν•˜λ‚˜μ˜ κ°’λ§Œμ„ κ°€μ§ˆ 수 있으며, 이 값은 κ·Έμ € β€œμ‘΄μž¬β€ν•œλ‹€. μ²˜μŒμ—λŠ” 이 말이 잘 이해가 μ•ˆ 갈 μˆ˜λ„ μžˆμ§€λ§Œ, C++의 voidκ°€ λ°”λ‘œ μ΄λŸ¬ν•œ νƒ€μž…μ΄λ‹€. void νƒ€μž…μ˜ 인자λ₯Ό λ°›κ³  void νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν•œλ²ˆ 생각해보면, 이 ν•¨μˆ˜λŠ” μ–΄λ–€ 상황이든 항상 호좜될 수 μžˆλ‹€. λ§Œμ•½ 이 ν•¨μˆ˜κ°€ μˆœμˆ˜ν•¨μˆ˜λΌλ©΄ 이 ν•¨μˆ˜λŠ” 항상 같은 값을 λ°˜ν™˜ν•  것이닀.

    μ•„λž˜ μ˜ˆμ‹œλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

    int f44() { return 44; }

    이 ν•¨μˆ˜κ°€ β€œμ•„λ¬΄ μΈμžλ„ 받지 μ•ŠλŠ” ν•¨μˆ˜β€λ‘œ 보일 μˆ˜λ„ μžˆμ§€λ§Œ, μ•žμ„œ μ‚΄νŽ΄λ³Έ κ²ƒμ²˜λŸΌ β€œμ•„λ¬΄ μΈμžλ„ 받지 μ•ŠλŠ” ν•¨μˆ˜β€λŠ” 호좜될 수 μ—†λ‹€. μ™œλƒν•˜λ©΄ β€œμ•„λ¬΄κ²ƒλ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€β€λΌλŠ” 것을 λ‚˜νƒ€λ‚΄λŠ” 값이 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ ‡λ‹€λ©΄ 이 ν•¨μˆ˜λŠ” 무엇을 인자둜 λ°›κ³  μžˆλŠ”κ±ΈκΉŒ? 사싀 κ°œλ…μ μœΌλ‘œ 보면 이 ν•¨μˆ˜λŠ” 단 ν•˜λ‚˜μ˜ μ›μ†Œλ§Œ μ‘΄μž¬ν•  수 μžˆλŠ” 더미 값을 λ°›λŠ”λ‹€κ³  λ³Ό 수 있기 λ•Œλ¬Έμ— μš°λ¦¬κ°€ 직접 이 값을 λͺ…μ‹œν•΄μ€„ ν•„μš”λŠ” μ—†λ‹€. κ·ΈλŸ¬λ‚˜ Haskellμ—μ„œλŠ” μ΄λŸ¬ν•œ 더미 값을 빈 κ΄„ν˜ΈμŒμΈ () 으둜 ν‘œν˜„ν•œλ‹€.

    이것이 μš°μ—°μΈμ§€ μ•„λ‹Œμ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ C++κ³Ό Haskellμ—μ„œ voidλ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법은 같은 λͺ¨μ–‘μœΌλ‘œ 보인닀. λ˜ν•œ Haskell은 간결함을 μ‚¬λž‘ν•˜κΈ° λ•Œλ¬Έμ— 기호 () κ°€ κ·Έ κ°’μ˜ νƒ€μž…, μƒμ„±μž, 그리고 이둜 인해 μƒμ„±λ˜λŠ” μœ μΌν•œ 값을 ν‘œν˜„ν•˜λŠ”λ°μ—λ„ μ‚¬μš©λœλ‹€.

    즉, μœ„μ˜ C++ν•¨μˆ˜λŠ” Haskellμ—μ„œλŠ” μ•„λž˜μ™€ 같이 ν‘œν˜„λœλ‹€.

    f44 :: () -> Integer
    f44 () = 44

    첫 번째 쀄은 f44 ν•¨μˆ˜κ°€ unit이라고 λ°œμŒν•˜λŠ” νƒ€μž… ()을 λ°›μ•„ Integer νƒ€μž…μ„ λ°˜ν™˜ν•œλ‹€κ³  μ„ μ–Έν•˜κ³  μžˆλ‹€. 두 번째 쀄은 f44 ν•¨μˆ˜κ°€ unit의 μœ μΌν•œ μƒμ„±μžμΈ ()λ₯Ό νŒ¨ν„΄ λ§€μΉ­ν•˜μ—¬ 숫자 44λ₯Ό μƒμ„±ν•œλ‹€λŠ” 것을 μ •μ˜ν•œλ‹€. 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” unit의 κ°’ ()λ₯Ό 인자둜 μ œκ³΅ν•˜λ©΄ λœλ‹€.

    f44 ()

    unit을 인자둜 λ°›λŠ” λͺ¨λ“  ν•¨μˆ˜λŠ” λ°˜ν™˜ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” μ›μ†Œ ν•˜λ‚˜λ₯Ό λ½‘λŠ” 것과 λ™μΌν•˜λ‹€κ³  생각할 수 μžˆλ‹€. (이 μ˜ˆμ‹œμ—μ„œλŠ” μ •μˆ˜ 44λ₯Ό λ½‘μ•˜λ‹€.)

    사싀 f44λŠ” 숫자 44의 또 λ‹€λ₯Έ ν‘œν˜„μ΄λΌκ³  λ³Ό μˆ˜λ„ μžˆλ‹€. μ΄λŠ” μ§‘ν•©μ˜ νŠΉμ •ν•œ μ›μ†Œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 이λ₯Ό ν•¨μˆ˜(ν™”μ‚΄ν‘œ)둜 ν‘œν˜„ν•˜λŠ” κ²ƒμœΌλ‘œ λŒ€μ²΄ν•˜λŠ” λ°©λ²•μ˜ μ˜ˆμ‹œμ΄κΈ°λ„ ν•˜λ‹€. unitμ—μ„œ μž„μ˜μ˜ νƒ€μž… A둜 λ‚˜μ•„κ°€λŠ” ν•¨μˆ˜(unit을 인자둜 λ°›μ•„ Aλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜)λŠ” 집합 A의 μ›μ†Œλ“€κ³Ό μΌλŒ€μΌ λŒ€μ‘ 관계에 μžˆλ‹€.

    κ·Έλ ‡λ‹€λ©΄ void νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, Haskellμ—μ„œλŠ” unit νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λŠ” μ–΄λ–¨κΉŒ? 보톡 C++μ—μ„œ 이런 ν•¨μˆ˜λŠ” μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ§€λ§Œ, μš°λ¦¬λŠ” 이미 이런 ν•¨μˆ˜λ“€μ΄ μˆ˜ν•™μ μΈ μ˜λ―Έμ—μ„œ μ§„μ§œ ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌλŠ” 것을 μ•Œκ³  μžˆλ‹€. 즉, unit을 λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜λŠ” 아무 일도 ν•˜μ§€ μ•Šκ³ , κ·Έλƒ₯ 인자λ₯Ό λ²„λ¦¬κΈ°λ§Œ ν•˜λŠ” 것이닀.

    μˆ˜ν•™μ μœΌλ‘œ 집합 Aμ—μ„œ λ‹¨μΌμ›μ†Œ μ§‘ν•©μœΌλ‘œ ν–₯ν•˜λŠ” ν•¨μˆ˜λŠ” 집합 A의 λͺ¨λ“  μ›μ†Œλ₯Ό 곡역에 ν•΄λ‹Ήν•˜λŠ” λ‹¨μΌμ›μ†Œ 집합에 λ“€μ–΄μžˆλŠ” μ›μ†Œ ν•˜λ‚˜μ— λ§€ν•‘ν•œλ‹€. λ”°λΌμ„œ λͺ¨λ“  A의 μ›μ†Œμ— λŒ€ν•΄ μ΄λŸ¬ν•œ 일을 ν•˜λŠ” ν•¨μˆ˜λŠ” 단 ν•˜λ‚˜λ§Œμ΄ μ‘΄μž¬ν•  수 μžˆλ‹€.

    μ•„λž˜ μ˜ˆμ‹œλ₯Ό 보도둝 ν•˜μž.

    fInt :: Integer -> ()
    fInt x = ()

    이 ν•¨μˆ˜λŠ” μž„μ˜μ˜ μ •μˆ˜λ₯Ό 인자둜 μž…λ ₯λ°›μœΌλ©΄ λ°˜λ“œμ‹œ unit을 λ°˜ν™˜ν•œλ‹€. μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ Haskell은 간결함을 μΆ”κ΅¬ν•˜κΈ° λ•Œλ¬Έμ— μ™€μΌλ“œμΉ΄λ“œ νŒ¨ν„΄μΈ μ–Έλ”μŠ€μ½”μ–΄(_)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ²„λ €μ§€λŠ” 인자λ₯Ό ν‘œν˜„ν•  수 있으며, 이 ν‘œν˜„μ„ μ‚¬μš©ν•˜λ©΄ 인자의 이름을 지정할 ν•„μš”λ„ μ—†λ‹€.

    즉, μœ„μ˜ μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ 같이 λ‹€μ‹œ ν‘œν˜„ν•΄λ³Ό 수 μžˆλ‹€.

    fInt :: Integer -> ()
    fInt _ = ()

    이 ν•¨μˆ˜λŠ” 인자둜 λ„˜κ²¨λ°›λŠ” κ°’ 뿐 μ•„λ‹ˆλΌ 인자의 νƒ€μž…μ—λ„ μ˜μ‘΄ν•˜κ³  μžˆμ§€ μ•Šλ‹€λŠ” 점에 μ£Όλͺ©ν•˜μž.

    이처럼 μž„μ˜μ˜ νƒ€μž…μ— λŒ€ν•΄μ„œ 항상 같은 ν˜•νƒœλ‘œ κ΅¬ν˜„λ  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜ λ‹€ν˜•μ„±(Parametrically Polymorphic)을 가진 ν•¨μˆ˜λΌκ³  ν•œλ‹€. ꡬ체적인 νƒ€μž…μ„ μ •ν•˜λŠ” λŒ€μ‹  νƒ€μž… λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ‚˜μ˜ λ°©μ •μ‹μœΌλ‘œ λ‹€μ–‘ν•œ ν•¨μˆ˜λ“€μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œ μž„μ˜μ˜ νƒ€μž…μ„ λ°›μ•„ unit을 λ°˜ν™˜ν•˜λ„λ‘ λ§Œλ“€μ–΄μ Έ λ‹€ν˜•μ„±μ„ κ°–μΆ˜ ν•¨μˆ˜λ₯Ό 뭐라고 λΆ€λ₯΄λ©΄ μ’‹μ„κΉŒ?

    κ³΅κ΅λ‘­κ²Œλ„ 이런 ν•¨μˆ˜λ„ λ˜‘κ°™μ΄ unit이라고 λΆ€λ₯Έλ‹€.

    unit :: a -> ()
    unit _ = ()

    C++μ—μ„œλŠ” 이 ν•¨μˆ˜λ₯Ό μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄λ³Ό 수 μžˆμ„ 것이닀.

    template<class T>
    void unit(T) {}

    λ‹€μŒμœΌλ‘œ μ‚΄νŽ΄λ³Ό νƒ€μž…μ˜ μœ ν˜•μ€ 두 개의 μ›μ†Œλ₯Ό 가진 집합이닀. C++μ—μ„œλŠ” 이λ₯Ό bool이라고 λΆ€λ₯΄λ©°, Haskellμ—μ„œλ„ 이와 λΉ„μŠ·ν•˜κ²Œ Bool이라고 λΆ€λ₯Έλ‹€. 이 두 κ°œλ… κ°„μ˜ 차이점은 C++의 bool은 built-in νƒ€μž…μΈ λ°˜λ©΄μ—, Haskellμ—μ„œλŠ” μ•„λž˜μ™€ 같이 μ •μ˜ν•  수 μžˆλ‹€λŠ” 것이닀.

    data Bool = True | False

    이 μ •μ˜λŠ” Bool νƒ€μž…μ΄ True λ˜λŠ” False 쀑 ν•˜λ‚˜μž„μ„ μ˜λ―Έν•œλ‹€. μ›μΉ™μ μœΌλ‘œλŠ” C++μ—μ„œλ„ Enum을 μ‚¬μš©ν•˜μ—¬ bool νƒ€μž…μ„ μ •μ˜ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

    ν•˜μ§€λ§Œ C++의 Enum은 λ‚΄λΆ€μ μœΌλ‘œ μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. C++11의 β€œEnum Class”λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆκ² μ§€λ§Œ, 이 경우 ν•΄λ‹Ή νƒ€μž…μ˜ 값을 μ‚¬μš©ν•  λ•Œ bool::false 처럼 항상 클래슀 이름을 λΆ™ν˜€μ£Όμ–΄μ•Ό ν•œλ‹€. λ˜ν•œ bool Enum을 μ‚¬μš©ν•˜λŠ” λͺ¨λ“  νŒŒμΌλ“€μ— μ μ ˆν•œ 헀더λ₯Ό ν¬ν•¨μ‹œμΌœμ€˜μ•Ό ν•œλ‹€.

    Bool νƒ€μž…μ„ 인자둜 λ°›λŠ” 순수 ν•¨μˆ˜λŠ” λŒ€μƒ νƒ€μž… λ‚΄μ—μ„œ True, False 두 값을 μ„ νƒν•œλ‹€.

    Bool을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ“€μ€ predicates라고 λΆˆλ¦¬λŠ”λ°, 예λ₯Ό λ“€μ–΄ Haskell 라이브러리인 Data.charλŠ” isAlpha, isDigit 같은 predicatesλ“€λ‘œ 가득 μ°¨μžˆλ‹€. C++에도 이와 λΉ„μŠ·ν•œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‘΄μž¬ν•˜λ©°, μ—­μ‹œ isalpha, isdigit 같은 ν•¨μˆ˜λ“€λ„ μžˆμ§€λ§Œ 이 녀석듀은 bool νƒ€μž…μ΄ μ•„λ‹Œ int νƒ€μž…μ„ λ°˜ν™˜ν•œλ‹€. μ‹€μ œ predicatesλŠ” std::ctype 에 μ •μ˜λ˜μ–΄μžˆμœΌλ©°, ctype::is(alpha, c), ctype::is(digit, c)와 같은 ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€.

    원문 보기

    πŸ‘‰ Category Theory for Programmers

    Evan Moon

    🐒 거뢁이처럼 μ‚΄μž

    κ°œλ°œμ„ μž˜ν•˜κΈ° μœ„ν•΄μ„œκ°€ μ•„λ‹Œ κ°œλ°œμ„ 즐기기 μœ„ν•΄ λ…Έλ ₯ν•˜λŠ” κ°œλ°œμžμž…λ‹ˆλ‹€. μ‚¬μ†Œν•œ 생각 정리뢀터 νŠœν† λ¦¬μ–Ό, μ‚½μ§ˆκΈ° 정도λ₯Ό 주둜 끄적이고 μžˆμŠ΅λ‹ˆλ‹€.