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

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


    μ§€κΈˆκΉŒμ§€λŠ” ν•¨μˆ˜ νƒ€μž…μ˜ 의미λ₯Ό κ°„λ‹¨ν•˜κ²Œλ§Œ μ„€λͺ…ν•΄μ™”λ‹€. ν•˜μ§€λ§Œ 쑰금 더 μžμ„Ένžˆ 듀여닀보면 ν•¨μˆ˜ νƒ€μž…μ€ λ‹€λ₯Έ νƒ€μž…κ³ΌλŠ” μ•½κ°„ λ‹€λ₯Έ νŠΉμ„±μ„ 가지고 μžˆλ‹€.

    예λ₯Ό λ“€μ–΄ Integer νƒ€μž…μ€ κ·Έλƒ₯ μ •μˆ˜λ“€μ˜ 집합, 그리고 Bool νƒ€μž…μ€ 두 개의 μ›μ†Œλ‘œ 이루어진 집합일 뿐이닀. κ·ΈλŸ¬λ‚˜ ν•¨μˆ˜ νƒ€μž… a -> b은 λŒ€μƒ a와 b 사이에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μ‚¬μƒλ“€μ˜ 집합이닀. μ–΄λ–€ μΉ΄ν…Œκ³ λ¦¬μ—μ„œ 두 객체 μ‚¬μ΄μ˜ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μ‚¬μƒλ“€μ˜ 집합은 Hom 집합이라고 ν•œλ‹€. 그리고 Hom 집합 λ˜ν•œ κ²°κ΅­ 집합이기 λ•Œλ¬Έμ— μΉ΄ν…Œκ³ λ¦¬ Set(λͺ¨λ“  μ§‘ν•©μ˜ μΉ΄ν…Œκ³ λ¦¬)μ—μ„œλŠ” Hom 집합 λ˜ν•œ Set에 ν¬ν•¨λœ λŒ€μƒμ΄λ‹€.

    Hom 집합도 결국 집합이기 때문에 Set에 포함된 대상이다.

    Set이 μ•„λ‹Œ λ‹€λ₯Έ μΉ΄ν…Œκ³ λ¦¬μ—μ„œλŠ” Hom 집합이 μΉ΄ν…Œκ³ λ¦¬ 외뢀에 μžˆλŠ” κ²½μš°λ„ μžˆλ‹€. 이런 경우 μ™ΈλΆ€(External) Hom 집합이라고 ν•œλ‹€.

    이것이 λ°”λ‘œ ν•¨μˆ˜ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…λ³΄λ‹€ νŠΉλ³„ν•˜κ²Œ λ§Œλ“œλŠ” μΉ΄ν…Œκ³ λ¦¬ Set의 자기 참쑰적인 성격이닀. 이런 μΉ΄ν…Œκ³ λ¦¬μ—μ„œλŠ” Hom 집합을 λ‚˜νƒ€λ‚΄λŠ” λŒ€μƒμ„ ꡬ성할 수 μžˆλŠ” 방법이 μ‘΄μž¬ν•˜λ©°, μ΄λŸ¬ν•œ λŒ€μƒμ„ λ‚΄λΆ€(Internal) Hom 집합이라고 ν•œλ‹€.

    카테고리 C의 Hom 집합은 외부 Hom 집합이다.

    9.1 보편적 ꡬ성(Universal Construction)

    자, 이제 ν•¨μˆ˜ νƒ€μž…μ΄ μ§‘ν•©μ΄λΌλŠ” 사싀은 μž μ‹œ 잊고, ν•¨μˆ˜ νƒ€μž…μ„ μΌλ°˜ν™”ν•˜μ—¬ λ‚΄λΆ€ Hom 집합이라고 μƒκ°ν•΄μ„œ μ²˜μŒλΆ€ν„° ꡬ성해보도둝 ν•˜μž. μΌλ°˜μ μœΌλ‘œλŠ” Set μΉ΄ν…Œκ³ λ¦¬κ°€ 이 ꡬ성에 λŒ€ν•œ λ‹¨μ„œλ₯Ό μ£Όκ² μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” μ§‘ν•©μ˜ νŠΉμ„±μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  생각해볼 것이닀. 이런 과정을 톡해 ν•˜λ‚˜μ˜ ꡬ성이 λ‹€λ₯Έ μΉ΄ν…Œκ³ λ¦¬μ— μžλ™μœΌλ‘œ 적용될 수 μžˆλ„λ‘ μΌλ°˜ν™”ν•΄λ³Ό 수 μžˆλ‹€.

    ν•¨μˆ˜ νƒ€μž…μ€ 인수 νƒ€μž…κ³Ό κ²°κ³Ό νƒ€μž…κ³Όμ˜ κ΄€κ³„λ‘œ 인해 볡합적인 νƒ€μž…μœΌλ‘œ κ°„μ£Όλœλ‹€. 이미 μš°λ¦¬λŠ” κ³± νƒ€μž…κ³Ό ν•© νƒ€μž…μ΄λΌλŠ” λŒ€μƒ κ°„μ˜ 관계λ₯Ό ν¬ν•¨ν•˜λŠ” 볡합적인 νƒ€μž…λ“€μ„ μ •μ˜ν•˜κΈ° μœ„ν•œ 보편적 ꡬ성(Universal Construction)에 λŒ€ν•΄μ„œ λ°°μ› λ˜ 적이 μžˆλ‹€. ν•¨μˆ˜ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 데도 λ™μΌν•œ 방법을 μ‚¬μš©ν•΄λ³Ό 수 μžˆλ‹€.

    ν•¨μˆ˜ νƒ€μž…μ„ μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ΅¬μ„±ν•˜λ €λŠ” ν•¨μˆ˜ νƒ€μž…, 인수 νƒ€μž…, κ²°κ³Ό νƒ€μž…μ„ λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” νŒ¨ν„΄μ΄ ν•„μš”ν•˜λ‹€.

    이 μ„Έ 가지 νƒ€μž…μ„ μ—°κ²°ν•˜λŠ” λͺ…ν™•ν•œ νŒ¨ν„΄μ€ ν•¨μˆ˜ 적용(Function application) λ˜λŠ” 평가(Evaluation)이라고 λΆˆλ¦°λ‹€. λ§Œμ•½ ν•¨μˆ˜ νƒ€μž…μ˜ 후보인 λŒ€μƒμ„ z라고 ν•˜κ³  인수 νƒ€μž…μΈ λŒ€μƒμ„ a라고 ν•  λ•Œ, 적용(Application)은 이 μŒμ„ κ²°κ³Ό νƒ€μž…μΈ λŒ€μƒ b둜 λ§€ν•‘ν•˜λŠ” ν–‰μœ„μ΄λ‹€. 즉, μš°λ¦¬μ—κ²ŒλŠ” 총 μ„Έ 가지 λŒ€μƒμ΄ 있으며, 이 쀑 인수 νƒ€μž…κ³Ό κ²°κ³Ό νƒ€μž… 두 κ°€μ§€λŠ” κ³ μ •λ˜μ–΄μžˆλŠ” 것이닀.

    μš°λ¦¬λŠ” 맀핑인 μ μš©λ„ 가지고 μžˆλ‹€. μ–΄λ–»κ²Œ ν•˜λ©΄ 이 맀핑을 이 νŒ¨ν„΄μ— 톡합할 수 μžˆμ„κΉŒ? λ§Œμ•½ μš°λ¦¬κ°€ λŒ€μƒ λ‚΄λΆ€λ₯Ό λ“€μ—¬λ‹€λ³Ό 수 μžˆλ‹€λ©΄, 집합 z의 μ›μ†ŒμΈ ν•¨μˆ˜ f와 집합 a의 μ›μ†ŒμΈ 인수 xλ₯Ό 짝지어 집합 b의 μ›μ†ŒμΈ f x둜 맀핑할 수 있게 λœλ‹€.

    함수 집합 z에서 함수 f를 선택하고, 인수 타입 a의 집합에서 하나의 인수 x를 선택한다.
    그러면 이제 집합 b에서 원소 f x를 얻을 수 있게된다.


    κ·ΈλŸ¬λ‚˜ μ΄λ ‡κ²Œ ν•˜λ‚˜μ˜ 쌍인 (f, x)λ₯Ό λ‹€λ£¨λŠ” κ²ƒλ³΄λ‹€λŠ” ν•¨μˆ˜ νƒ€μž… z와 인수 νƒ€μž… a의 전체적인 곱에 λŒ€ν•΄μ„œ μ΄μ•ΌκΈ°ν•˜λŠ” 것이 더 μΌλ°˜ν™”λœ κ°œλ…μΌ 것이닀. κ³± zΓ—a λ˜ν•œ ν•˜λ‚˜μ˜ λŒ€μƒμ΄λ©°, 이 λŒ€μƒμ—μ„œ b둜의 ν™”μ‚΄ν‘œμΈ 우리의 적용 λ³€ν˜•μœΌλ‘œ gλ₯Ό 선택할 수 μžˆλ‹€. Setμ—μ„œλŠ” gκ°€ λͺ¨λ“  쌍 (f, x)λ₯Ό f x둜 λ§€ν•‘ν•˜λŠ” ν•¨μˆ˜κ°€ 될 것이닀.

    두 λŒ€μƒ z와 a의 곱이 사상 g에 μ˜ν•΄ λ‹€λ₯Έ λŒ€μƒ b둜 μ—°κ²°λ˜λŠ”, 이것이 λ°”λ‘œ νŒ¨ν„΄μ΄λ‹€.

    정말 이 νŒ¨ν„΄μ΄ 보편적 ꡬ성을 톡해 ν•¨μˆ˜ νƒ€μž…μ„ λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•  수 μžˆλŠ” κ²ƒμΌκΉŒ? 사싀 λͺ¨λ“  μΉ΄ν…Œκ³ λ¦¬μ— λŒ€ν•΄μ„œ 생각해본닀면 그렇지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ μš°λ¦¬κ°€ μ§€κΈˆ λ‹€λ£¨κ³ μž ν•˜λŠ” μΉ΄ν…Œκ³ λ¦¬μ— λŒ€ν•΄μ„œλŠ” μΆ©λΆ„ν•˜λ‹€.

    κ·Έλ ‡λ‹€λ©΄ 또 λ‹€λ₯Έ μ§ˆλ¬Έμ„ ν•΄λ³΄μž. κ³Όμ—° μš°λ¦¬λŠ” 곱을 λ¨Όμ € μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ ν•¨μˆ˜ λŒ€μƒμ„ μ •μ˜ν•  수 μžˆμ„κΉŒ? λͺ¨λ“  쌍의 λŒ€μƒμ— λŒ€ν•΄ 곱이 μ—†λŠ” μΉ΄ν…Œκ³ λ¦¬λ‚˜ λͺ¨λ“  쌍의 곱이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μΉ΄ν…Œκ³ λ¦¬λ„ μžˆμ§€ μ•Šμ€κ°€? 정닡은 β€œμ•„λ‹ˆλ‹€β€μ΄λ‹€. κ³± νƒ€μž…μ΄ μ—†λ‹€λ©΄ ν•¨μˆ˜ νƒ€μž…λ„ μ‘΄μž¬ν•  수 μ—†λ‹€. 이에 λŒ€ν•œ λ‚΄μš©μ€ μΆ”ν›„ μ§€μˆ˜(Exponentials)에 λŒ€ν•΄ μ„€λͺ…ν•˜λ©° λ‹€μ‹œ 닀루도둝 ν•˜κ² λ‹€.

    4 이 그림이 바로 보편적 구성의 시작점인 대상과 사상의 패턴이다.

    ν•œλ²ˆ 보편적 ꡬ성에 λŒ€ν•΄ κ²€ν† ν•΄λ³΄μž. μš°μ„  λŒ€μƒκ³Ό μ‚¬μƒμ˜ νŒ¨ν„΄μ—μ„œλΆ€ν„° μ‹œμž‘ν•  것이닀. λ¬Όλ‘  κ·Έμ € λŒ€μƒκ³Ό μ‚¬μƒμ˜ νŒ¨ν„΄μ΄λΌκ³ λ§Œ ν•˜λ©΄ ꡉμž₯히 λ§Žμ€ κ²°κ³Όκ°€ 맀칭될 것이기 λ•Œλ¬Έμ— μ΄λŒ€λ‘œλŠ” μƒλ‹Ήνžˆ λΆ€μ •ν™•ν•œ 쿼리라고 ν•  수 μžˆλ‹€.

    Setμ—μ„œλŠ” 거의 λͺ¨λ“  것이 μ„œλ‘œ μ—°κ²°λ˜μ–΄μžˆλ‹€. μ–΄λ–€ λŒ€μƒ z와 λŒ€μƒ a의 곱을 ν˜•μ„±ν•  μˆ˜λ„ 있으며, 이 κ³±μ—μ„œ b둜의 ν•¨μˆ˜λ„ μ‘΄μž¬ν•  수 μžˆλ‹€. (단, bκ°€ 빈 집합일 κ²½μš°λŠ” μ œμ™Έν•œλ‹€.)

    이제 이 νŒ¨ν„΄μ˜ 결과듀에 λŒ€ν•œ μˆœμœ„λ₯Ό λ§€κΈ΄λ‹€λŠ” 비밀무기λ₯Ό κΊΌλ‚΄λ³Ό 차둀이닀. 일반적으둜 후보 λŒ€μƒλ“€ μ‚¬μ΄μ—λŠ” 이 ꡬ성을 μ–΄λ–€ λ°©μ‹μ΄λ‘œλ“  λΆ„ν•΄ν•  수 μžˆλŠ” κ³ μœ ν•œ 맀핑이 μžˆμ–΄μ•Ό ν•œλ‹€.

    ν•„μžλŠ” z와 zΓ—aμ—μ„œ b둜 ν–₯ν•˜λŠ” 사상 gκ°€ z'와 이에 μ μš©λ˜λŠ” 사상 g’보닀 μš°μˆ˜ν•˜λ‹€κ³  κ²°μ •ν•  것이닀. 그리고 λ§Œμ•½ 이 결정이 참이라면 z'μ—μ„œ z둜 ν–₯ν•˜λŠ” μœ μΌν•œ 사상 h이 μ‘΄μž¬ν•΄μ•Ό ν•  것이닀. 그리고 이 사상은 g'λ₯Ό μ μš©ν•œ 결과와 gλ₯Ό μ μš©ν•œ κ²°κ³Όκ°€ λ™μΌν•˜λ‹€λŠ” 것 λ˜ν•œ 보μž₯ν•΄μ•Όν•œλ‹€. (잘 μ΄ν•΄λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ•„λž˜ 그림을 λ³΄λ©΄μ„œ 이 λ¬Έμž₯을 μ½μ–΄λ³΄μž.)

    5 함수 대상에 대한 후보들 간의 순위를 결정한다.

    μ—¬κΈ°κ°€ 쑰금 μ–΄λ €μš΄ 뢀뢄인데, 이게 λ°”λ‘œ ν•„μžκ°€ 이 보편적 ꡬ성에 λŒ€ν•œ μ •μ˜λ₯Ό 계속 질질 끌고 있던 μ΄μœ μ΄λ‹€. 사상 h :: z'-> zκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ μš°λ¦¬λŠ” z’와 zκ°€ λͺ¨λ‘ a와 μ—°κ²°λ˜μ–΄μžˆλŠ” λ‹€μ΄μ–΄κ·Έλž¨μ„ λ‹«κΈ°λ₯Ό μ›ν•œλ‹€.

    πŸ’‘ μ—­μ£Ό

    λ‹€μ΄μ–΄κ·Έλž¨μ„ λ‹«λŠ”λ‹€λŠ” 이야기가 μ΄ν•΄ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄, 자료ꡬ쑰 κ·Έλž˜ν”„λ₯Ό λ– μ˜¬λ €λ³΄λ©΄ λœλ‹€. μ—¬κΈ°μ„œ z’와 zκ°€ λͺ¨λ‘ μ—°κ²°λ˜μ–΄μžˆλŠ” λ‹€μ΄μ–΄κ·Έλž¨μ„ λ‹«κ³  μ‹Άλ‹€λŠ” μ˜λ―ΈλŠ”, zβ†’a, z’→a, z’→z처럼 μ—°κ²°λ˜μ–΄μžˆκ³  λ‹€λ₯Έ λŒ€μƒλ“€κ³ΌλŠ” 이어지지 μ•Šμ€ κ·Έλž˜ν”„λ₯Ό λ§Œλ“€κ³  μ‹Άλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

    이λ₯Ό μœ„ν•΄ ν•„μš”ν•œ 것은 zβ€™μ—μ„œ z둜 ν–₯ν•˜λŠ” 맀핑 hκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό μ΄μš©ν•΄μ„œ z'Γ—aμ—μ„œ zΓ—a둜의 맀핑을 μ–»μ–΄λ‚΄λŠ” 것이닀. μ•žμ„œ 곱의 ν•¨μˆ˜μ μΈ νŠΉμ§•μ— λŒ€ν•΄ λ…Όμ˜ν–ˆμ—ˆμœΌλ‹ˆ, 이제 이 과정에 λŒ€ν•΄ 이해할 수 μžˆμ„ 것이닀.

    κ³± μžμ²΄λŠ” νŽ‘ν„°, μ •ν™•ν•˜κ²ŒλŠ” 엔도 이항 νŽ‘ν„°μ΄κΈ° λ•Œλ¬Έμ— μŒμ— λŒ€ν•œ 사상을 λ¦¬ν”„νŒ…ν•  수 μžˆλ‹€. λ‹€λ₯Έ 말둜 ν•˜λ©΄ μš°λ¦¬λŠ” λŒ€μƒμ˜ κ³± 뿐만 μ•„λ‹ˆλΌ μ‚¬μƒμ˜ 곱도 μ •μ˜ν•  수 μžˆλ‹€λŠ” 것이닀.

    이λ₯Ό λ¦¬ν”„νŒ…ν•˜κΈ° μœ„ν•΄ κ³± z'Γ—a의 두 번째 ꡬ성 μš”μ†ŒμΈ aμ—λŠ” μ•„λ¬΄λŸ° 영ν–₯을 λΌμΉ˜μ§€ μ•Šμ•„μ•Ό ν•˜λ―€λ‘œ, a에 λŒ€ν•œ 항등사상인 idλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μƒμ˜ 쌍 (h, id)λ₯Ό λ¦¬ν”„νŒ…ν•  것이닀.

    g’λ₯Ό gκ°€ ν¬ν•¨λœ μ‹μœΌλ‘œ 인수 λΆ„ν•΄ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

    g' = g β—¦ (h Γ— id)

    μ—¬κΈ°μ„œμ˜ 핡심은 곱이 사상에 λŒ€ν•΄μ„œ μ–΄λ–»κ²Œ μž‘μš©ν•˜κ³  μžˆλŠ”μ§€λ₯Ό λ³΄λŠ” 것이닀.

    보편적 κ΅¬μ„±μ˜ μ„Έ 번째 νŒŒνŠΈλŠ” 보편적으둜 κ°€μž₯ 쒋은 λŒ€μƒμ„ μ„ νƒν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€. ν•„μžλŠ” 이 λŒ€μƒμ„ a β‡’ b라고 λΆ€λ₯Ό 것이닀. (참고둜 이건 μ–΄λ–€ λŒ€μƒμ— λŒ€ν•œ 상징적인 이름이며, Haskell νƒ€μž… 클래슀 μ œμ•½κ³ΌλŠ” κ΄€λ ¨μ—†λŠ” 넀이밍이닀. 좔후에 쑰금 더 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 이름을 지을 수 μžˆλŠ” 방법에 λŒ€ν•΄ λ…Όμ˜ν•΄λ³΄κ² λ‹€.)

    a β‡’ bλΌλŠ” λŒ€μƒμ€ (a β‡’ b) Γ— a μ—μ„œ b둜 ν–₯ν•˜λŠ” 사상인 evalμ΄λΌλŠ” μ μš©μ„ 가지고 μžˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ ν•¨μˆ˜ λŒ€μƒ ν›„λ³΄λ‘œλΆ€ν„° μΆœλ°œν•˜λŠ” 사상 gκ°€ eval을 ν¬ν•¨ν•œ μ‹μœΌλ‘œ λΆ„ν•΄λ˜μ–΄ 이 λŒ€μƒμ— μœ μΌν•˜κ²Œ 맀핑될 수 μžˆλ‹€λ©΄, λŒ€μƒ a β‡’ bκ°€ κ°€μž₯ μ ν•©ν•œ 후보라고 ν•  수 μžˆμ„ 것이닀.

    6 이것이 보편적 구성을 통한 함수 대상의 정의이다. 위 그림과 동일한 다이어그램이지만 이제 대상 a ⇒ b가 가장 보편적이게 되었다.

    ν•œλ²ˆ μ •λ¦¬ν•΄λ³΄μž.

    aμ—μ„œ b둜 ν–₯ν•˜λŠ” ν•¨μˆ˜ λŒ€μƒμ€ λŒ€μƒ a β‡’ b와 사상 eval :: ((a β‡’ b) Γ— a) -> b 으둜 μ •μ˜λœλ‹€. λ§Œμ•½ μž„μ˜μ˜ λ‹€λ₯Έ λŒ€μƒ z Γ— aμ—μ„œ b둜 ν–₯ν•˜λŠ” 사상 g :: z Γ— a -> bκ°€ 주어진닀면, zμ—μ„œ a β‡’ b둜 ν–₯ν•˜λŠ” μœ μΌν•œ 사상 h :: z -> (a β‡’ b)이 μ‘΄μž¬ν•΄μ•Όν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ gλŠ” eval을 ν¬ν•¨ν•œ μ‹μœΌλ‘œ 뢄해될 수 μžˆμ–΄μ•Ό ν•œλ‹€.

    g = eval β—¦ (h Γ— id)

    λ¬Όλ‘  λͺ¨λ“  μΉ΄ν…Œκ³ λ¦¬μ—μ„œ λ°˜λ“œμ‹œ μž„μ˜μ˜ λŒ€μƒμ˜ 쌍 a와 b에 λŒ€ν•΄ λŒ€μƒ a β‡’ bκ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•  κ²ƒμ΄λΌλŠ” 보μž₯은 μ—†λ‹€. ν•˜μ§€λ§Œ μ΅œμ†Œν•œ Setμ—μ„œλ§ŒνΌμ€ 항상 μ‘΄μž¬ν•œλ‹€. κ²Œλ‹€κ°€ 이 λŒ€μƒμ€ Set의 Hom 집합인 Set(a,b)Set(a,b)와도 λ™ν˜•μ΄λ‹€.

    9.2 컀링(Currying)

    ν•¨μˆ˜ λŒ€μƒμ— λŒ€ν•œ 후보λ₯Ό λ‹€μ‹œ ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž. κ·ΈλŸ¬λ‚˜ μ΄λ²ˆμ—λŠ” 사상 gλ₯Ό 두 λ³€μˆ˜ z와 a에 λŒ€ν•œ ν•¨μˆ˜λ‘œ 생각해볼 것이닀.

    g :: z Γ— a -> b

    λŒ€μƒμ˜ κ³±μœΌλ‘œλΆ€ν„° μΆœλ°œν•œ 사상은 두 개의 λ³€μˆ˜λ₯Ό 가진 ν•¨μˆ˜μ™€ μœ μ‚¬ν•œ ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€. Setμ—μ„œ gλŠ” 집합 zκ³Ό 집합 aμ—μ„œ 값을 ν•˜λ‚˜μ”© 가져와 κ΅¬μ„±ν•œ μŒμ—μ„œ μΆœλ°œν•˜κ²Œ 될 것이닀.

    그리고 ν•¨μˆ˜ gκ°€ 가진 보편적인 속성에 따라 각각의 g에 λŒ€ν•΄ zλ₯Ό ν•¨μˆ˜ λŒ€μƒ a β‡’ b둜 λ§€ν•‘ν•˜λŠ” μœ μΌν•œ 사상 h λ˜ν•œ μ‘΄μž¬ν•œλ‹€λŠ” 것을 λ– μ˜¬λ €λ³Ό 수 μžˆλ‹€.

    h :: z -> (a b)

    Setμ—μ„œλŠ” λ‹¨μˆœνžˆ hκ°€ νƒ€μž…μ΄ z인 λ³€μˆ˜λ₯Ό ν•˜λ‚˜ λ°›μ•„ aμ—μ„œ b둜 ν–₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž„μ„ μ˜λ―Έν•œλ‹€. μ΄λŸ¬ν•œ μ •μ˜λŠ” hλ₯Ό κ³ μ°¨ν•¨μˆ˜(Higher ordered function)둜 λ§Œλ“ λ‹€.

    λ”°λΌμ„œ 보편적 ꡬ성은 μ΄λ³€μˆ˜ ν•¨μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” μΌλ³€μˆ˜ ν•¨μˆ˜ κ°„μ˜ μΌλŒ€μΌ λŒ€μ‘μ„ μ„€μ •ν•œλ‹€. 이 λŒ€μ‘μ€ 컀링(Currying)이라고 뢈리며, hλŠ” g의 컀링된(Curried) 버전이라고 ν•œλ‹€.

    이처럼 μ–΄λ–€ gκ°€ μ£Όμ–΄μ‘Œμ„λ•Œ μœ μΌν•œ hκ°€ μ‘΄μž¬ν•˜κ³ , μ–΄λ–€ hκ°€ μ£Όμ–΄μ§ˆ λ•Œλ„ μ•„λž˜μ˜ 곡식을 μ΄μš©ν•˜μ—¬ μ΄λ³€μˆ˜ ν•¨μˆ˜μΈ gλ₯Ό λ‹€μ‹œ 생성할 수 있기 λ•Œλ¬Έμ— μΌλŒ€μΌ λŒ€μ‘μ΄λΌκ³  ν•  수 μžˆλ‹€.

    g = eval β—¦ (h Γ— id)

    μ΄λ•Œ ν•¨μˆ˜ gλŠ” h의 μ»€λ§λ˜μ§€ μ•Šμ€(Uncurried) 버전이라고 ν•  수 μžˆλ‹€. 사싀 컀링은 ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” Haskell의 κ΅¬λ¬Έλ§ŒμœΌλ‘œλ„ ν‘œν˜„ν•  수 μžˆλ‹€.

    a -> (b -> c)

    이런 문법은 보톡 μ•„λž˜μ™€ 같이 κ΄„ν˜Έκ°€ 제거된 μ‹œκ·Έλ„ˆμΉ˜λ₯Ό 톡해 μ΄λ³€μˆ˜ ν•¨μˆ˜λ‘œ ν•΄μ„λœλ‹€.

    a -> b -> c

    μ΄λŸ¬ν•œ 해석은 λ‹€μΈμˆ˜ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ λͺ…ν™•ν•˜κ²Œ 확인해볼 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 ν•¨μˆ˜μ²˜λŸΌ 말이닀.

    catstr :: String -> String -> String
    catstr s s' = s ++ s'

    이 ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ 인수λ₯Ό λ°›μ•„ λ‹€μ‹œ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν˜•νƒœλ‘œλ„ μž‘μ„±ν•  수 μžˆλ‹€. λ§Œμ•½ λžŒλ‹€λ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό 같을 것이닀.

    catstr' s = \s' -> s ++ s'

    이 두 μ •μ˜λŠ” λ™λ“±ν•˜λ©°, 두 μ •μ˜ 쀑 μ–΄λ–€ 것을 μ‚¬μš©ν•˜λ“  ν•˜λ‚˜μ˜ μΈμˆ˜μ— λŒ€ν•΄ λΆ€λΆ„ μ μš©λ˜μ–΄ μ•„λž˜μ™€ 같이 ν•˜λ‚˜μ˜ 인수λ₯Ό 받은 ν•¨μˆ˜λ₯Ό 생성할 수 μžˆλ‹€.

    greet :: String -> String
    greet = catstr "Hello "

    μ—„λ°€νžˆ λ§ν•˜μžλ©΄ μ΄λ³€μˆ˜ ν•¨μˆ˜λŠ” κ³± νƒ€μž…μΈ μŒμ„ λ°›λŠ” ν•¨μˆ˜μ΄λ‹€.

    (a, b) -> c

    이 두 개의 ν‘œν˜„ κ°„μ˜ λ³€ν™˜μ€ κ°„λ‹¨ν•˜λ‹€. 이미 μ˜ˆμƒν–ˆκ² μ§€λ§Œ μ΄λŸ¬ν•œ λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” 두 개의 κ³ μ°¨ν•¨μˆ˜λŠ” curry와 uncurry둜 λΆˆλ¦°λ‹€.

    curry :: ((a, b) -> c) -> (a -> b -> c)
    curry f a b = f (a, b)
    uncurry :: (a -> b -> c) -> ((a, b) -> c)
    uncurry f (a, b) = f a b

    curryκ°€ ν•¨μˆ˜ λŒ€μƒμ˜ 보편적 ꡬ성을 μœ„ν•œ μΈμˆ˜λΆ„ν•΄(factorization)λΌλŠ” 점에 μ£Όλͺ©ν•˜μž. 이 점은 μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ λ‹€μ‹œ μž‘μ„±ν•΄λ³΄λ©΄ 더 λͺ…ν™•ν•˜κ²Œ μ•Œ 수 μžˆλ‹€.

    factorizer :: ((a, b) -> c) -> (a -> (b -> c))
    factorizer g = \a -> (\b -> g (a, b))

    λ‹€μ‹œ ν•œλ²ˆ 짚고 λ„˜μ–΄κ°€μžλ©΄ factorizerλΌλŠ” μΈμˆ˜λΆ„ν•΄ ν–‰μœ„λŠ” ν›„λ³΄λ‘œλΆ€ν„° λΆ„ν•΄ ν•¨μˆ˜λ₯Ό μƒμ„±ν•œλ‹€.

    C++κ³Ό 같이 ν•¨μˆ˜ν˜• μ–Έμ–΄κ°€ μ•„λ‹Œ μ–Έμ–΄μ—μ„œλ„ 컀링이 κ°€λŠ₯ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ 일이 쑰금 λ³΅μž‘ν•΄μ§„λ‹€. C++μ—μ„œμ˜ λ‹€μΈμˆ˜ ν•¨μˆ˜λŠ” Haskellμ—μ„œ νŠœν”Œμ„ λ°›λŠ” ν•¨μˆ˜μ— ν•΄λ‹Ήν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€. (μ—¬κΈ°μ„œ 더 ν˜Όλž€μŠ€λŸ¬μš΄ 점은 C++μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ std::tuple을 λ°›λŠ” ν•¨μˆ˜, κ°€λ³€ 인수 ν•¨μˆ˜, μ΄ˆκΈ°ν™” 리슀트λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€λŠ” 점이닀.)

    C++ ν•¨μˆ˜λ₯Ό λΆ€λΆ„ μ μš©ν•˜λ €λ©΄ ν…œν”Œλ¦Ώ std::bindλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. 예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같이 두 개의 λ¬Έμžμ—΄μ„ λ°›λŠ” ν•¨μˆ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž.

    std::string catstr(std::string s1, std::string s2) {
        return s1 + s2;
    }

    그럼 이 ν•¨μˆ˜μ™€ std::bindλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄μ„ λ°›λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄λ³Ό 수 μžˆλ‹€.

    using namespace std::placeholders;
    
    auto greet = std::bind(catstr, "Hello ", _1);
    std::cout << greet("Haskell Curry");

    ScalaλŠ” C++μ΄λ‚˜ Java에 λΉ„ν•˜λ©΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— 더 가깝긴 ν•˜μ§€λ§Œ, 사싀은 μ• λ§€ν•œ μ–΄λ”˜κ°€μ— μœ„μΉ˜ν•˜κ³  μžˆλ‹€. λ§Œμ•½ ν•¨μˆ˜κ°€ λΆ€λΆ„ μ μš©λ˜λ„λ‘ μž‘μ„±ν•˜λ €λ©΄ μ•„λž˜μ²˜λŸΌ μ—¬λŸ¬ 인수의 λͺ©λ‘μœΌλ‘œ μ •μ˜ν•  수 μžˆλ‹€.

    def catstr(s1: String)(s2: String) = s1 + s2

    λ¬Όλ‘  이 μ½”λ“œλŠ” 이 ν•¨μˆ˜κ°€ ν™•μ‹€νžˆ λΆ€λΆ„ 적용될 κ²ƒμ΄λΌλŠ” 것을 κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ˜ˆμ§€λ ₯에 μ˜μ‘΄ν•˜κ³  μžˆμ§€λ§Œ 말이닀.

    9.3 μ§€μˆ˜(Exponentials)

    μˆ˜ν•™ λ…Όλ¬Έμ—μ„œ ν•¨μˆ˜ λŒ€μƒ λ˜λŠ” 두 λŒ€μƒ a와 b μ‚¬μ΄μ˜ λ‚΄λΆ€ Hom λŒ€μƒμ€ μ’…μ’… μ§€μˆ˜(Exponential)둜 뢈리며 ba라고 ν‘œκΈ°λœλ‹€. μ²˜μŒμ—λŠ” 이 ν‘œκΈ°λ²•μ΄ 쑰금 어색해보일 수 μžˆμ§€λ§Œ, ν•¨μˆ˜μ™€ 곱의 관계λ₯Ό 생각해보면 κ·Έλ ‡κ²Œ μ΄μƒν•œ 것도 μ•„λ‹ˆλ‹€. 이미 λ‚΄λΆ€ Hom λŒ€μƒμ˜ 보편적 κ΅¬μ„±μ—μ„œ 곱이 ν•„μš”ν•˜λ‹€λŠ” 것을 ν•œ μ°¨λ‘€ ν™•μΈν–ˆμ§€λ§Œ, 사싀 이 λ‘˜ κ°„μ˜ 연결은 더 μ‹¬μ˜€ν•˜λ‹€.

    이 연결은 Bool, Char, Int, Doubleκ³Ό 같이 μœ ν•œν•œ 값을 κ°€μ§€λŠ” 집합 κ°„μ˜ ν•¨μˆ˜λ₯Ό κ³ λ €ν•΄λ³Ό λ•Œ μ œλŒ€λ‘œ 확인해볼 수 μžˆλ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜λ“€μ€ μ›λ‘ μ μœΌλ‘œ μ™„μ „νžˆ λ©”λͺ¨μ•„이징(Memoizing)될 수 μžˆκ±°λ‚˜ 데이터 ꡬ쑰둜 λ³€ν™˜λ˜μ–΄ 쑰회될 μˆ˜λ„ μžˆλ‹€. 이것이 λ°”λ‘œ μ‚¬μƒμœΌλ‘œμ¨μ˜ ν•¨μˆ˜μ™€ λŒ€μƒμœΌλ‘œμ¨μ˜ ν•¨μˆ˜ νƒ€μž… κ°„ λ™λ“±μ„±μ˜ λ³Έμ§ˆμ΄λ‹€.

    예λ₯Ό λ“€μ–΄ Boolμ—μ„œμ˜ 순수 ν•¨μˆ˜λŠ” False에 ν•΄λ‹Ήν•˜λŠ” κ°’κ³Ό True에 ν•΄λ‹Ήν•˜λŠ” κ°’μ˜ μŒμ— μ˜ν•΄ μ™„μ „νžˆ νŠΉμ •ν™”λœλ‹€. Boolμ—μ„œ Int둜 ν–₯ν•˜λŠ” λͺ¨λ“  ν•¨μˆ˜μ˜ 집합은 λͺ¨λ“  Int μŒλ“€μ˜ 집합이닀. 이것은 κ³± Int Γ— Int, 쑰금 더 창의적으둜 ν‘œκΈ°ν•΄λ³΄μžλ©΄ Int2와 λ™μΌν•˜λ‹€.

    λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ C++의 νƒ€μž…μΈ charλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž. 이 νƒ€μž…μ€ 총 256개의 값을 ν¬ν•¨ν•˜κ³  μžˆλ‹€.

    C++ ν‘œμ€€ 라이브러리의 isupper, isspace와 같은 일뢀 ν•¨μˆ˜λ“€μ€ ν…Œμ΄λΈ” 쑰회λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„λ˜λ©°, 이 ν…Œμ΄λΈ”μ€ 256개의 λΆ€μšΈ κ°’λ“€μ˜ νŠœν”Œκ³Ό λ™λ“±ν•˜λ‹€. νŠœν”Œμ€ κ³± νƒ€μž…μ΄λ―€λ‘œ μš°λ¦¬λŠ” bool Γ— bool Γ— bool Γ— ... Γ— boolκ³Ό 같은 256개의 λΆ€μšΈμ˜ 곱을 λ– μ˜¬λ €λ³Ό 수 μžˆλ‹€.

    그리고 μš°λ¦¬λŠ” μ΄λ ‡κ²Œ 반볡적인 곱이 곧 μ§€μˆ˜(Exponential)을 μ •μ˜ν•œλ‹€λŠ” 사싀을 μ•Œκ³  μžˆλ‹€. λ§Œμ•½ bool을 char νƒ€μž…μ΄ 가진 κ°’μ˜ 개수인 256번만큼 κ³±ν•œλ‹€λ©΄, bool을 char만큼 κ±°λ“­μ œκ³±ν•œ 것, 즉, boolcharλ₯Ό 얻을 수 μžˆλ‹€.

    κ·Έλ ‡λ‹€λ©΄ bool의 256 νŠœν”Œλ‘œ μ •μ˜λœ νƒ€μž…μ—λŠ” μ–Όλ§ˆλ‚˜ λ§Žμ€ 값이 μ‘΄μž¬ν•˜λŠ” κ²ƒμΌκΉŒ? μ •ν™•ν•˜κ²Œ 22562^{256}κ°œμ΄λ‹€. μ΄λŠ” charμ—μ„œ bool둜 ν–₯ν•˜λŠ” μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜λ“€μ˜ κ°œμˆ˜μ™€λ„ λ™μΌν•˜λ©°, 각 ν•¨μˆ˜λŠ” κ³ μœ ν•œ 256 νŠœν”Œμ— ν•΄λ‹Ήλœλ‹€.

    λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ boolμ—μ„œ char둜 ν–₯ν•˜λŠ” ν•¨μˆ˜μ˜ κ°œμˆ˜λ„ 계산해보면 2562256^2κ°œλΌλŠ” 사싀을 μ•Œ 수 μžˆλ‹€. ν•¨μˆ˜ νƒ€μž…μ— λŒ€ν•œ μ§€μˆ˜ ν‘œκΈ°λ²•μ€ 이런 의미λ₯Ό 가지고 μžˆλŠ” 것이닀.

    μ•„λ§ˆ μš°λ¦¬λŠ” intλ‚˜ doubleμ—μ„œ μΆœλ°œν•˜λŠ” ν•¨μˆ˜λ₯Ό λͺ¨λ‘ λ©”λͺ¨μ•„μ΄μ¦ˆν•˜κ³  μ‹Άμ–΄ν•˜μ§€λŠ” μ•Šμ„ 것이닀. ν•˜μ§€λ§Œ 비둝 μ‹€μš©μ μ΄μ§€ μ•Šλ”λΌλ„ ν•¨μˆ˜μ™€ 데이터 νƒ€μž… μ‚¬μ΄μ˜ 동등성은 λͺ…ν™•νžˆ μ‘΄μž¬ν•œλ‹€.

    그리고 리슀트, 트리, λ¬Έμžμ—΄κ³Ό 같은 λ¬΄ν•œν•œ νƒ€μž…λ„ μžˆλ‹€. μ΄λŸ¬ν•œ νƒ€μž…μ—μ„œ μΆœλ°œν•˜λŠ” ν•¨μˆ˜λ₯Ό λ©”λͺ¨μ•„μ΄μ¦ˆν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¬΄ν•œν•œ μ €μž₯ 곡간을 ν•„μš”λ‘œ ν•œλ‹€.

    κ·ΈλŸ¬λ‚˜ Haskell은 게으λ₯Έ μ–Έμ–΄μ΄λ―€λ‘œ, 게으λ₯΄κ²Œ ν‰κ°€λ˜λŠ” λ¬΄ν•œν•œ 데이터 ꡬ쑰와 ν•¨μˆ˜ μ‚¬μ΄μ˜ κ²½κ³„λŠ” λͺ¨ν˜Έν•˜κ²Œ λ‹€κ°€μ˜¨λ‹€. μ΄λŸ¬ν•œ ν•¨μˆ˜μ™€ 데이터 κ°„μ˜ μŒλŒ€μ„±μ€ ν•¨μˆ˜ νƒ€μž…μ„ μΉ΄ν…Œκ³ λ¦¬λ‘ μ  μ§€μˆ˜ λŒ€μƒκ³Ό λ™μΌμ‹œ ν•  수 μžˆλ‹€λŠ” 것을 μ„€λͺ…ν•œλ‹€. μ΄λŸ¬ν•œ νŠΉμ„±μ€ μš°λ¦¬κ°€ 가진 데이터에 λŒ€ν•œ κ°œλ…κ³Όλ„ μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ— Haskellμ—μ„œλŠ” ν•¨μˆ˜λ₯Ό λ°μ΄ν„°μ²˜λŸΌ μ·¨κΈ‰ν•  수 μžˆλ‹€.

    9.4 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬(Cartesian Closed Categories)

    λ¬Όλ‘  ν•„μžλŠ” 계속 μ§‘ν•©μ˜ μΉ΄ν…Œκ³ λ¦¬λ₯Ό νƒ€μž…κ³Ό ν•¨μˆ˜μ˜ λͺ¨λΈλ‘œ μ‚¬μš©ν•  κ²ƒμ΄μ§€λ§Œ, 이런 λͺ©μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 더 큰 μΉ΄ν…Œκ³ λ¦¬ νŒ¨λ°€λ¦¬κ°€ μžˆλ‹€λŠ” 것을 μ–ΈκΈ‰ν•˜λŠ” 것은 μΆ©λΆ„νžˆ κ°€μΉ˜κ°€ μžˆμ„ 것 κ°™λ‹€. 이런 μΉ΄ν…Œκ³ λ¦¬λŠ” 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬(Cartesian closed categories)라고 ν•˜λ©°, Set은 κ·Έμ € 이 μΉ΄ν…Œκ³ λ¦¬ 쀑 ν•˜λ‚˜μ˜ 예일 뿐이닀.

    데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬λŠ” μ•„λž˜ μ„Έ 가지λ₯Ό λ°˜λ“œμ‹œ ν¬ν•¨ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.

    1. μ’…κ²° λŒ€μƒ
    2. μ–΄λ–€ 두 λŒ€μƒμ˜ κ³±
    3. μ–΄λ–€ 두 λŒ€μƒμ˜ μ§€μˆ˜

    μ§€μˆ˜λ₯Ό λ¬΄ν•œνžˆ λ§Žμ€ 횟수둜 λ°˜λ³΅λ˜λŠ” 곱이라고 κ°„μ£Όν•œλ‹€λ©΄, 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬λŠ” μž„μ˜μ˜ ν•­μˆ˜λ₯Ό μ§€μ›ν•˜λŠ” 것이라고 생각할 수 μžˆλ‹€. 특히 μ’…κ²° λŒ€μƒμ€ 곱의 항등원(0)인 λŒ€μƒμ˜ κ³± λ˜λŠ” λŒ€μƒμ˜ 항등원(0) 승이라고 λ³Ό 수 μžˆλ‹€.

    컴퓨터 κ³Όν•™μ˜ κ΄€μ μ—μ„œ 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬λ“€μ΄ ν₯미둜운 μ΄μœ λŠ” 이 μΉ΄ν…Œκ³ λ¦¬λ“€μ΄ κ°„λ‹¨ν•˜κ²Œ νƒ€μ΄ν•‘λœ λžŒλ‹€ λ―Έμ λΆ„λ²•μ˜ λͺ¨λΈμ„ μ œκ³΅ν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€. 이 λͺ¨λΈμ€ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ 기초λ₯Ό ν˜•μ„±ν•œλ‹€.

    μ’…κ²° λŒ€μƒκ³Ό κ³± μ—°μ‚°μ—λŠ” 각각 초기 λŒ€μƒκ³Ό ν•© μ—°μ‚°μ΄λΌλŠ” μŒλŒ€(Dual)κ°€ μ‘΄μž¬ν•œλ‹€.

    a Γ— (b + c) = a Γ— b + a Γ— c
    (b + c) Γ— a = b Γ— a + c Γ— a

    이 두 μš”μ†Œλ₯Ό μ§€μ›ν•˜κ³  곱이 합을 톡해 뢄배될 수 μžˆλŠ” 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬λ₯Ό 이쀑 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬(Bicartesian closed category)라고 ν•œλ‹€. λ‹€μŒ μ„Ήμ…˜μ—μ„œ λ³΄κ² μ§€λ§Œ μš°λ¦¬κ°€ 계속 λ‹€λ€„μ˜¨ Set이 λŒ€ν‘œμ μΈ 이쀑 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬μ΄λ©°, 이 μΉ΄ν…Œκ³ λ¦¬λŠ” λͺ‡ 가지 ν₯미둜운 νŠΉμ„±μ„ 가지고 μžˆλ‹€.

    9.5 μ§€μˆ˜μ™€ λŒ€μˆ˜μ  μžλ£Œν˜•(Exponentials and Algebraic Data Types)

    ν•¨μˆ˜ νƒ€μž…μ„ μ§€μˆ˜λ‘œ ν•΄μ„ν•˜λŠ” 것은 λŒ€μˆ˜μ  μžλ£Œν˜•μ˜ 체계에 μ•„μ£Ό 잘 λ“€μ–΄λ§žλŠ”λ‹€. μ‹€μ œλ‘œ κ³ λ“±ν•™κ΅μ—μ„œ λ°°μš°λŠ” λŒ€μˆ˜ν•™μ—μ„œ λ‚˜μ˜€λŠ” 숫자 0κ³Ό 1, ν•©, κ³±, 그리고 μ§€μˆ˜μ™€ κ΄€λ ¨λœ 기본적인 항등식은 각각 초기 λŒ€μƒ, μ’…κ²° λŒ€μƒ, 합집합, 곱집합 그리고 μ§€μˆ˜μ— λŒ€ν•΄ 거의 κ·ΈλŒ€λ‘œ μ μš©λœλ‹€λŠ” 것을 λ³Ό 수 μžˆλ‹€.

    μš°λ¦¬λŠ” 아직 이 μ„±μ§ˆμ„ μ œλŒ€λ‘œ 증λͺ…ν• λ§Œν•œ 수반(Adjunction)μ΄λ‚˜ μš”λ„€λ‹€ 보쑰정리같은 도ꡬλ₯Ό 가지고 μžˆμ§€λŠ” μ•Šμ§€λ§Œ, κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  λ…μž μ—¬λŸ¬λΆ„κ»˜ 직관을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ 일단 μ­‰ μ„€λͺ…해보겠닀.

    9.5.1 0승

    a0=1a^0 = 1

    μΉ΄ν…Œκ³ λ¦¬μ  ν•΄μ„μ—μ„œ μš°λ¦¬λŠ” 0을 초기 λŒ€μƒμœΌλ‘œ, 1을 μ’…κ²° λŒ€μƒμœΌλ‘œ, 그리고 등식을 λ™ν˜•μ‚¬μƒμœΌλ‘œ λŒ€μ²΄ν•œλ‹€. μ—¬κΈ°μ„œ μ§€μˆ˜λŠ” λ‚΄λΆ€ Hom λŒ€μƒμ„ μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— κ²°κ΅­ a0a^0μ΄λΌλŠ” 식은 초기 λŒ€μƒμ—μ„œ μž„μ˜μ˜ λŒ€μƒ a둜 ν–₯ν•˜λŠ” μ‚¬μƒμ˜ 집합을 λ‚˜νƒ€λ‚Έλ‹€. 초기 λŒ€μƒμ˜ μ •μ˜μ— 따라 이런 사상은 μ •ν™•νžˆ ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  수 μžˆμœΌλ―€λ‘œ Hom 집합 C(0,a)C(0,a)λŠ” 단일 μ›μ†Œ 집합이닀.

    단일 μ›μ†Œ 집합은 Setμ—μ„œμ˜ μ’…κ²° λŒ€μƒμ΄λ―€λ‘œ, 이 항등식은 Setμ—μ„œ μ‰½κ²Œ 성립할 수 μžˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 이 항등식이 이쀑 데카λ₯΄νŠΈ λ‹«νžŒ μΉ΄ν…Œκ³ λ¦¬μ˜ λͺ¨λ“  κ²½μš°μ— λŒ€ν•΄μ„œ μ„±λ¦½ν•œλ‹€λŠ” 것이닀.

    Haskellμ—μ„œλŠ” 0을 Void둜, 1을 μœ λ‹› νƒ€μž…μΈ ()으둜 λŒ€μ²΄ν•œλ‹€. κ²°κ΅­ ν•„μžκ°€ μ•žμ—μ„œ ν–ˆλ˜ μ£Όμž₯은 Voidμ—μ„œ μž„μ˜μ˜ νƒ€μž… a둜 ν–₯ν•˜λŠ” ν•¨μˆ˜μ˜ 집합이 μœ λ‹› νƒ€μž…κ³Ό λ™λ“±ν•˜λ‹€λŠ” 것이닀. λ‹€μ‹œ λ§ν•˜μžλ©΄ Void -> a ν•¨μˆ˜λŠ” ν•˜λ‚˜λΏμ΄λΌλŠ” 것이닀. 그리고 μš°λ¦¬λŠ” 이미 이 ν•¨μˆ˜λ₯Ό μ˜ˆμ „μ— λ³Έ 적이 μžˆλ‹€. λ°”λ‘œ absurd ν•¨μˆ˜μ΄λ‹€.

    κ·ΈλŸ¬λ‚˜ 이것을 ν˜„μ‹€μ— κ΅¬ν˜„ν•˜κΈ°λŠ” μ•½κ°„ κΉŒλ‹€λ‘­λ‹€. μ΄μœ λŠ” 크게 두 가지인데, 첫째둜 Haskellμ—μ„œλŠ” μ‹€μ œλ‘œ μ–΄λ–€ 값도 μ†ν•˜μ§€ μ•ŠλŠ” νƒ€μž…μ΄λΌλŠ”κ²Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λͺ¨λ“  νƒ€μž…μ€ β€œλλ‚˜μ§€ μ•ŠλŠ” κ³„μ‚°μ˜ 결과” λ˜λŠ” Bottom(_|_)을 ν¬ν•¨ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

    λ‘λ²ˆμ§Έ μ΄μœ λŠ” absurdμ—λŠ” μ–΄λ–€ 값도 전달할 수 μ—†κΈ° λ•Œλ¬Έμ— λˆ„κ°€ 무슨 짓을 ν•˜λ˜ κ²°κ΅­ 아무도 μ‹€ν–‰μ‹œν‚¬ 수 μ—†λ‹€λŠ” 점이닀. κ²°κ΅­ 이 ν•¨μˆ˜μ˜ κ΅¬ν˜„μ€ 근본적으둜 λͺ¨λ‘ λ™λ“±ν•˜λ‹€λŠ” 것이닀. κ·Έλ ‡λ‹€κ³  ν•΄μ„œ λ§Œμ•½ μ˜μ›νžˆ λλ‚˜μ§€ μ•ŠλŠ” 계산을 μ „λ‹¬ν•œλ‹€λ©΄ 이 ν•¨μˆ˜λŠ” κ²°μ½” λ°˜ν™˜μ΄λΌλŠ” ν–‰μœ„κΉŒμ§€ λ„λ‹¬ν•˜μ§€ λͺ»ν•  것이닀.

    9.5.2 1의 μ§€μˆ˜

    1a=11^a = 1

    μœ„ 식은 Setμ—μ„œ 해석될 λ•Œ λͺ¨λ“  λŒ€μƒμ—μ„œ μ’…κ²° λŒ€μƒμœΌλ‘œ ν–₯ν•˜λŠ” κ³ μœ ν•œ 사상이 μ‘΄μž¬ν•œλ‹€λŠ” μ’…κ²° λŒ€μƒμ— λŒ€ν•œ μ •μ˜λ₯Ό λ‹€μ‹œ ν•œλ²ˆ ν‘œν˜„ν•˜κ³  μžˆλ‹€. 일반적으둜 aμ—μ„œ μ’…κ²° λŒ€μƒμœΌλ‘œ ν–₯ν•˜λŠ” λ‚΄λΆ€ Hom λŒ€μƒμ€ μ’…κ²° λŒ€μƒκ³Ό λ™ν˜•μ΄λ‹€.

    Haskellμ—μ„œ μž„μ˜μ˜ νƒ€μž… aμ—μ„œ μœ λ‹›μœΌλ‘œ ν–₯ν•˜λŠ” ν•¨μˆ˜λŠ” a -> () 단 ν•˜λ‚˜ 뿐이닀. μš°λ¦¬λŠ” 이 ν•¨μˆ˜λ₯Ό unit이라고 λΆ€λ₯Έλ‹€λŠ” 것을 이미 μ•Œκ³  μžˆλ‹€. 이 ν•¨μˆ˜λŠ” ()에 λΆ€λΆ„ 적용된 const ν•¨μˆ˜λ‘œ 생각할 μˆ˜λ„ μžˆλ‹€.

    9.5.3 1승

    a1=aa^1 = a

    μœ„ 식은 μ’…κ²° λŒ€μƒμœΌλ‘œλΆ€ν„° μΆœλ°œν•˜λŠ” 사상은 λŒ€μƒ a의 μ›μ†Œλ₯Ό μ„ νƒν•˜λŠ”λ° μ‚¬μš©λ  수 μžˆλ‹€λŠ” 것을 λ‹€μ‹œ ν‘œν˜„ν•œ 것이닀. μ΄λŸ¬ν•œ μ‚¬μƒλ“€μ˜ 집합은 λŒ€μƒ μžμ²΄μ™€ λ™ν˜•μ΄λ‹€. Set, 그리고 Haskellμ—μ„œλŠ” 집합 a의 μ›μ†Œλ“€κ³Ό ν•΄λ‹Ή μ›μ†Œλ“€μ„ μ„ νƒν•˜λŠ” ν•¨μˆ˜λ“€μΈ () -> aκ°€ λ™ν˜•μ΄λΌλŠ” 것이닀.

    9.5.4 μ§€μˆ˜μ˜ ν•©

    ab+c=abΓ—aca^{b+c} = a^b Γ—a^c

    μΉ΄ν…Œκ³ λ¦¬λ‘ μ μœΌλ‘œ μœ„ 식은 λŒ€μƒμ˜ 두 μ§€μˆ˜μ˜ 합이 각 μ§€μˆ˜λ₯Ό 가진 λŒ€μƒλ“€μ˜ κ³±κ³Ό λ™ν˜•μ΄λΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

    이 λŒ€μˆ˜μ  λ™ν˜•μ„±μ„ Haskellμ—μ„œ λ‹€λ£¨κ²Œ 되면 맀우 μ‹€μš©μ μΈ 해석을 κ°€μ Έλ‹€μ€€λ‹€. μ΄λŠ” 두 νƒ€μž…μ˜ ν•©μœΌλ‘œλΆ€ν„° μΆœλ°œν•˜λŠ” ν•¨μˆ˜κ°€ 각각의 νƒ€μž…μœΌλ‘œλΆ€ν„° μΆœλ°œν•˜λŠ” ν•¨μˆ˜μ˜ 쌍과 λ™λ“±ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

    이 κ°œλ…μ΄ λ°”λ‘œ μš°λ¦¬κ°€ 합에 λŒ€ν•œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ¬Έλ²•μ˜ 근원이닀. μš°λ¦¬λŠ” 합을 μ˜λ―Έν•˜λŠ” Eitherλ₯Ό μ •μ˜ν•  λ•Œ case 문을 μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³ , 각각의 νƒ€μž… μƒμ„±μžλ₯Ό λ”°λ‘œ μ²˜λ¦¬ν•˜λŠ” 두 개, ν˜Ήμ€ κ·Έ μ΄μƒμ˜ ν•¨μˆ˜λ‘œ λ‚˜λˆˆλ‹€.

    예λ₯Ό λ“€μ–΄ ν•© νƒ€μž…(Either Int Double)λ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

    f :: Either Int Double -> String

    이 경우 EitherλŠ” 각각 Int와 Double에 λŒ€ν•œ ν•¨μˆ˜μ˜ 쌍으둜 μ •μ˜λ  수 μžˆλ‹€.

    f (Left n) = if n < 0 then "Negative int" else "Positive int"
    f (Right x) = if x < 0.0 then "Negative double" else "Positive double"

    9.5.5 μ§€μˆ˜μ˜ μ§€μˆ˜

    (ab)c=abΓ—c(a^b)^c = a^{bΓ—c}

    μœ„ 식은 μ§€μˆ˜ λŒ€μƒλ“€μ— λŒ€ν•œ 컀링(Currying)을 ν‘œν˜„ν•˜κ³  μžˆλ‹€. ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 것은 κ³±μ—μ„œ μΆœλ°œν•˜λŠ” ν•¨μˆ˜, 즉 μ΄λ³€μˆ˜ ν•¨μˆ˜μ™€ λ™λ“±ν•˜λ‹€.

    9.5.6 곱의 μ§€μˆ˜

    (aΓ—b)c=acΓ—bc(aΓ—b)^c =a^c Γ— b^c

    Haskellμ—μ„œ μŒμ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λŠ” 각 쌍의 μš”μ†Œ ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜λŠ” 두 ν•¨μˆ˜μ˜ 쌍과 λ™λ“±ν•˜λ‹€.

    이처럼 κ³ λ“±ν•™κ΅μ—μ„œ λ°°μš°λŠ” λŒ€μˆ˜ν•™μ˜ κ°„λ‹¨ν•œ 항등식듀이 μΉ΄ν…Œκ³ λ¦¬ 이둠으둜 ν™•μž₯λ˜μ–΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‹€μš©μ μœΌλ‘œ 적용될 수 μžˆλ‹€λŠ” 것은 ꡉμž₯히 λ†€λΌμš΄ 일이닀.

    9.6 컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒ(Curry-Howard Isomorphism)

    ν•„μžλŠ” 이미 논리와 λŒ€μˆ˜μ  μžλ£Œν˜• κ°„μ˜ λŒ€μ‘ 관계에 λŒ€ν•΄ μ–ΈκΈ‰ν•œ 적이 μžˆλ‹€. Void νƒ€μž…κ³Ό μœ λ‹› νƒ€μž…(())은 각각 거짓과 참에 ν•΄λ‹Ήν•˜λ©°, κ³± νƒ€μž…κ³Ό ν•© νƒ€μž…μ€ 논리곱(AND)κ³Ό 논리합(OR)에 ν•΄λ‹Ήν•œλ‹€. 이 μ²΄κ³„μ—μ„œ ν•¨μˆ˜ νƒ€μž…μ€ 논리적 ν•¨μ˜(β‡’)에 ν•΄λ‹Ήν•œλ‹€. λ‹€μ‹œ 말해 νƒ€μž… a -> bλŠ” β€œλ§Œμ•½ a라면 b이닀”라고 읽을 수 μžˆλ‹€.

    컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒμ— λ”°λ₯΄λ©΄ λͺ¨λ“  νƒ€μž…μ€ μ°Έ λ˜λŠ” 거짓일 수 μžˆλŠ” λͺ…μ œ, 즉 μ§„μˆ μ΄λ‚˜ νŒλ‹¨μœΌλ‘œ 해석될 수 μžˆλ‹€. ν•΄λ‹Ή νƒ€μž…μ΄ μ‘΄μž¬ν•˜λ©΄ κ·Έ λͺ…μ œλŠ” 참으둜 κ°„μ£Όλ˜κ³ , μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ κ±°μ§“μœΌλ‘œ κ°„μ£Όλœλ‹€. 특히 논리적 ν•¨μ˜κ°€ μ°Έμ΄λΌλŠ” 것은 그에 ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜ νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€λŠ” 것을 μ˜λ―Έν•˜λ©°, κ·Έ νƒ€μž…μ˜ ν•¨μˆ˜κ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

    λ”°λΌμ„œ ν•¨μˆ˜μ˜ κ΅¬ν˜„ μžμ²΄κ°€ μ •λ¦¬μ˜ 증λͺ…이 λ˜λŠ” 것이며, μš°λ¦¬κ°€ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 것은 정리λ₯Ό 증λͺ…ν•˜λŠ” 것과 λ™λ“±ν•˜λ‹€. ν•œλ²ˆ λͺ‡ 가지 μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž.

    ν•¨μˆ˜ λŒ€μƒμ˜ μ •μ˜μ—μ„œ μ†Œκ°œν–ˆλ˜ eval ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² λ‹€. eval의 μ‹œκ·Έλ‹ˆμ²˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

    eval :: ((a -> b), a) -> b

    이 ν•¨μˆ˜λŠ” ν•¨μˆ˜μ™€ κ·Έ 인자둜 κ΅¬μ„±λœ μŒμ„ λ°›μ•„ μ μ ˆν•œ νƒ€μž…μ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. 즉 μœ„ μ½”λ“œλŠ” 사상에 λŒ€ν•œ Haskellμ—μ„œμ˜ κ΅¬ν˜„μ΄λ‹€.

    eval :: (a β‡’ b) Γ— a -> b

    μœ„ ν‘œν˜„μ€ ν•¨μˆ˜ νƒ€μž… a β‡’ b (λ˜λŠ” μ§€μˆ˜ λŒ€μƒ ba)λ₯Ό μ •μ˜ν•œλ‹€. 이 μ„œλͺ…을 컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒμ„ μ‚¬μš©ν•˜μ—¬ 논리적 μˆ μ–΄λ‘œ λ²ˆμ—­ν•΄λ³΄μž.

    ((a β‡’ b) ∧ a) β‡’ b

    이 λͺ…μ œλŠ” λ§Œμ•½ bκ°€ aλ‘œλΆ€ν„° λ„μΆœλ˜λŠ” 것이 참이고, a λ˜ν•œ 참이라면, b λ˜ν•œ λ°˜λ“œμ‹œ 참이어야 ν•œλ‹€κ³  읽을 수 μžˆλ‹€. μ΄λŠ” μ§κ΄€μ μœΌλ‘œ μ™„λ²½ν•œ 의미λ₯Ό 가지고 있으며 κ³ λŒ€λΆ€ν„° 전건 긍정(modus ponens)라고 λΆˆλ €μ™”λ‹€. 이제 λ‹€μŒ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ 이 정리λ₯Ό 증λͺ…ν•  수 μžˆλ‹€.

    eval :: ((a -> b), a) -> b
    eval (f, x) = f x

    aλ₯Ό λ°›μ•„μ„œ bλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ f와 νƒ€μž… a의 ꡬ체적인 κ°’ x둜 κ΅¬μ„±λœ μŒμ„ μ œκ³΅ν•œλ‹€λ©΄, ν•¨μˆ˜ fλ₯Ό x에 μ μš©ν•¨μœΌλ‘œμ¨ νƒ€μž… b의 ꡬ체적인 값을 생성할 수 μžˆλ‹€.

    즉, ν•„μžλŠ” 이 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ νƒ€μž… ((a -> b), a) -> bκ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν•œλ‹€λŠ” 것을 λ³΄μ˜€λ‹€. λ”°λΌμ„œ 우리의 λ…Όλ¦¬μ—μ„œ 전건 긍정(modus ponens)λŠ” 참이닀.

    κ·Έλ ‡λ‹€λ©΄ λͺ…λ°±ν•˜κ²Œ 거짓인 μˆ μ–΄λŠ” μ–΄λ–¨κΉŒ? 예λ₯Ό λ“€μ–΄ β€œλ§Œμ•½ a λ˜λŠ” bκ°€ 참이면, aλŠ” λ°˜λ“œμ‹œ 참이어야 ν•œλ‹€β€μ™€ 같은 λͺ…μ œκ°€ μžˆλ‹€.

    a ∨ b β‡’ a

    μ΄λŠ” λͺ…λ°±ν•˜κ²Œ 잘λͺ»λœ λͺ…μ œμ΄λ‹€. μ™œλƒν•˜λ©΄ 이 λͺ…μ œλŒ€λ‘œλΌλ©΄ aκ°€ 거짓이고  bκ°€ 참인 상황도 μ‘΄μž¬ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. 이 μˆ μ–΄λ₯Ό 컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒμ„ μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λ‘œ λ§€ν•‘ν•˜λ©΄ λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

    Either a b -> a

    사싀 아무리 μ‹œλ„λ₯Ό ν•˜λ”λΌλ„ 이 ν•¨μˆ˜λŠ” μ ˆλŒ€ κ΅¬ν˜„ν•  수 μ—†λ‹€. Right κ°’μœΌλ‘œ ν˜ΈμΆœλ˜μ—ˆμ„ λ•ŒλŠ” a νƒ€μž…μ˜ 값을 생성할 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. (μš°λ¦¬κ°€ 순수 ν•¨μˆ˜μ— λŒ€ν•΄μ„œλ§Œ μ΄μ•ΌκΈ°ν•˜κ³  μžˆλ‹€λŠ” 점을 κΈ°μ–΅ν•˜μž)

    이제 λ“œλ””μ–΄ absurd ν•¨μˆ˜μ˜ μ§„μ§œ μ˜λ―Έμ— λŒ€ν•΄ 이야기할 λ•Œκ°€ λ˜μ—ˆλ‹€.

    absurd :: Void -> a

    λ§Œμ•½ Voidκ°€ β€œκ±°μ§“β€μ΄λΌκ³  λ²ˆμ—­λœλ‹€κ³  생각해보면 μš°λ¦¬λŠ” μ•„λž˜μ™€ 같은 μˆ μ–΄λ₯Ό 얻을 수 μžˆλ‹€.

    false β‡’ a

    κ±°μ§“μ—μ„œλŠ” μ–΄λ–€ 것이든 λ”°λΌμ˜¬ 수 μžˆλ‹€(ex falso quodlibet). μ—¬κΈ° Haskellμ—μ„œ 이 λͺ…μ œ(ν•¨μˆ˜)λ₯Ό 증λͺ…(κ΅¬ν˜„)ν•  수 μžˆλŠ” ν•œ 가지 μ˜ˆμ‹œκ°€ μžˆλ‹€.

    absurd (Void a) = absurd a

    Haskellμ—μ„œ VoidλŠ” λ‹€μŒκ³Ό 같이 μ •μ˜λœλ‹€.

    newtype Void = Void Void

    Void νƒ€μž…μ€ κΉŒλ‹€λ‘œμš΄ 녀석이닀. 이 μ •μ˜λŠ” Void νƒ€μž…μ˜ 값을 μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” Void νƒ€μž…μ˜ 값이 ν•„μš”ν•˜λ‹€λŠ” 의미λ₯Ό 가지고 있기 λ•Œλ¬Έμ— μ ˆλŒ€ 값을 ꡬ성할 수 μ—†κ²Œ λ§Œλ“ λ‹€. κ²°κ΅­ Void νƒ€μž…μ˜ κ°’μ΄λΌλŠ” 것은 μ‘΄μž¬ν•  μˆ˜κ°€ μ—†μœΌλ―€λ‘œ absurd ν•¨μˆ˜λŠ” μ ˆλŒ€ 호좜될 μˆ˜κ°€ μ—†λŠ” 것이닀.

    πŸ’‘ μ—­μ£Ό

    β€œκ±°μ§“μ—μ„œλŠ” μ–΄λ–€ 것이든 λ”°λΌμ˜¬ 수 μžˆλ‹€β€λΌλŠ” 뜻의 ex falso quodlibetλŠ” 거짓 λͺ…μ œλ‘œλΆ€ν„°λŠ” μ–΄λ–€ λͺ…μ œλΌλ„ μœ λ„λ  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•˜λ©°, μ΄λŠ” λ…Όλ¦¬ν•™μ—μ„œ 맀우 μ€‘μš”ν•œ 원칙 쀑 ν•˜λ‚˜μ΄λ‹€.

    μ‰½κ²Œ λ§ν•˜μžλ©΄ 거짓인 μ „μ œκ°€ 주어진닀면, κ·Έ μ „μ œλ‘œλΆ€ν„° λ‚˜μ˜€λŠ” μ–΄λ– ν•œ 결둠도 λͺ¨λ‘ 정당화될 수 μžˆλ‹€λŠ” 것이닀.이와 λ§ˆμ°¬κ°€μ§€λ‘œ absurd ν•¨μˆ˜λŠ” μ ˆλŒ€ 생성될 수 μ—†λŠ” κ°’μ˜ νƒ€μž…μΈ Voidλ₯Ό 인자둜 λ°›μ•„ μž„μ˜μ˜ νƒ€μž… aλ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€κ³  μ„ μ–Έλœλ‹€.

    즉, κ±°μ§“μœΌλ‘œλΆ€ν„° μΆœλ°œν–ˆμœΌλ‹ˆ μ–΄λ–€ νƒ€μž…μ„ λ°˜ν™˜ν•˜λ”λΌλ„ 논리가 κΉ¨μ§€μ§€λŠ” μ•ŠλŠ” 것이닀.참고둜 absurd ν•¨μˆ˜λŠ” μ ˆλŒ€ 호좜될 μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ μ‚¬μš©λ  μˆ˜λŠ” μ—†κ³ , μˆœμˆ˜ν•˜κ²Œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ νƒ€μž… μ‹œμŠ€ν…œμ˜ 원리λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•œ 이둠적인 λͺ©μ μœΌλ‘œλ§Œ μ‚¬μš©λœλ‹€.

    λ¬Όλ‘  이 μ˜ˆμ‹œλ“€μ΄ λͺ¨λ‘ ν₯λ―Έλ‘­κΈ°λŠ” ν•˜μ§€λ§Œ, λ„λŒ€μ²΄ 컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒμ΄ μš°λ¦¬μ—κ²Œ μ–΄λ–€ μ‹€μš©μ μΈ ν˜œνƒμ„ κ°€μ Έλ‹€μ€€λ‹€λŠ” κ²ƒμΌκΉŒ? μ•„λ§ˆλ„ 일상적인 ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μ•„λ‹ˆκ² μ§€λ§Œ, Agdaλ‚˜ Coq와 같은 ν”„λ‘œκ·Έλž˜λ° 언어듀은 정리λ₯Ό 증λͺ…ν•˜κΈ° μœ„ν•΄ 컀리-ν•˜μ›Œλ“œ λ™ν˜•μ‚¬μƒμ„ ν™œμš©ν•œλ‹€.

    μ»΄ν“¨ν„°λŠ” μˆ˜ν•™μžλ“€μ΄ κ·Έλ“€μ˜ 일을 ν•˜λŠ”λ° 도움을 μ£ΌλŠ” κ²ƒλΏλ§Œ μ•„λ‹ˆλΌ, μˆ˜ν•™μ˜ 근본을 ν˜μ‹ ν•˜κ³  μžˆλ‹€. μ΄λŸ¬ν•œ λΆ„μ•Όμ—μ„œ κ°€μž₯ μ΅œκ·Όμ— 뜨거운 감자둜 λ– μ˜€λ₯΄λŠ” μ—°κ΅¬λŠ” 호λͺ¨ν† ν”Ό νƒ€μž… 이둠이라고 ν•˜λ©°, νƒ€μž… 이둠의 λ°œμ „μ— 큰 κΈ°μ—¬λ₯Ό ν•˜κ³ μžˆλ‹€. 이 이둠은 Boolean, Integer, κ³±κ³Ό μŒλŒ€κ³±, ν•¨μˆ˜ νƒ€μž… λ“±μœΌλ‘œ 가득 μ°¨ μžˆλ‹€. 그리고 μ΄λŸ¬ν•œ 이둠은 Coq와 Agdaμ—μ„œ κ³΅μ‹μ μœΌλ‘œ λ„μž…λ˜κ³  μžˆλ‹€.

    이처럼 μ»΄ν“¨ν„°λŠ” μ—¬λŸ¬ λ°©λ©΄μ—μ„œ 세상을 ν˜μ‹ ν•˜κ³  μžˆλ‹€.

    Evan Moon

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

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