[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 9. ν¨μ νμ
μ§κΈκΉμ§λ ν¨μ νμ μ μλ―Έλ₯Ό κ°λ¨νκ²λ§ μ€λͺ ν΄μλ€. νμ§λ§ μ‘°κΈ λ μμΈν λ€μ¬λ€λ³΄λ©΄ ν¨μ νμ μ λ€λ₯Έ νμ κ³Όλ μ½κ° λ€λ₯Έ νΉμ±μ κ°μ§κ³ μλ€.
μλ₯Ό λ€μ΄ Integer
νμ
μ κ·Έλ₯ μ μλ€μ μ§ν©, κ·Έλ¦¬κ³ Bool
νμ
μ λ κ°μ μμλ‘ μ΄λ£¨μ΄μ§ μ§ν©μΌ λΏμ΄λ€. κ·Έλ¬λ ν¨μ νμ
a -> b
μ λμ a
μ b
μ¬μ΄μ μ‘΄μ¬νλ λͺ¨λ μ¬μλ€μ μ§ν©μ΄λ€. μ΄λ€ μΉ΄ν
κ³ λ¦¬μμ λ κ°μ²΄ μ¬μ΄μ μ‘΄μ¬νλ λͺ¨λ μ¬μλ€μ μ§ν©μ Hom μ§ν©μ΄λΌκ³ νλ€. κ·Έλ¦¬κ³ Hom μ§ν© λν κ²°κ΅ μ§ν©μ΄κΈ° λλ¬Έμ μΉ΄ν
κ³ λ¦¬ Set(λͺ¨λ μ§ν©μ μΉ΄ν
κ³ λ¦¬)μμλ Hom μ§ν© λν Setμ ν¬ν¨λ λμμ΄λ€.
Setμ΄ μλ λ€λ₯Έ μΉ΄ν κ³ λ¦¬μμλ Hom μ§ν©μ΄ μΉ΄ν κ³ λ¦¬ μΈλΆμ μλ κ²½μ°λ μλ€. μ΄λ° κ²½μ° μΈλΆ(External) Hom μ§ν©μ΄λΌκ³ νλ€.
μ΄κ²μ΄ λ°λ‘ ν¨μ νμ μ λ€λ₯Έ νμ λ³΄λ€ νΉλ³νκ² λ§λλ μΉ΄ν κ³ λ¦¬ Setμ μκΈ° μ°Έμ‘°μ μΈ μ±κ²©μ΄λ€. μ΄λ° μΉ΄ν κ³ λ¦¬μμλ Hom μ§ν©μ λνλ΄λ λμμ ꡬμ±ν μ μλ λ°©λ²μ΄ μ‘΄μ¬νλ©°, μ΄λ¬ν λμμ λ΄λΆ(Internal) Hom μ§ν©μ΄λΌκ³ νλ€.
9.1 보νΈμ ꡬμ±(Universal Construction)
μ, μ΄μ ν¨μ νμ
μ΄ μ§ν©μ΄λΌλ μ¬μ€μ μ μ μκ³ , ν¨μ νμ
μ μΌλ°ννμ¬ λ΄λΆ Hom μ§ν©μ΄λΌκ³ μκ°ν΄μ μ²μλΆν° ꡬμ±ν΄λ³΄λλ‘ νμ. μΌλ°μ μΌλ‘λ Set
μΉ΄ν
κ³ λ¦¬κ° μ΄ κ΅¬μ±μ λν λ¨μλ₯Ό μ£Όκ² μ§λ§, μ¬κΈ°μλ μ§ν©μ νΉμ±μ μμ‘΄νμ§ μκ³ μκ°ν΄λ³Ό κ²μ΄λ€. μ΄λ° κ³Όμ μ ν΅ν΄ νλμ ꡬμ±μ΄ λ€λ₯Έ μΉ΄ν
κ³ λ¦¬μ μλμΌλ‘ μ μ©λ μ μλλ‘ μΌλ°νν΄λ³Ό μ μλ€.
ν¨μ νμ μ μΈμ νμ κ³Ό κ²°κ³Ό νμ κ³Όμ κ΄κ³λ‘ μΈν΄ 볡ν©μ μΈ νμ μΌλ‘ κ°μ£Όλλ€. μ΄λ―Έ μ°λ¦¬λ κ³± νμ κ³Ό ν© νμ μ΄λΌλ λμ κ°μ κ΄κ³λ₯Ό ν¬ν¨νλ 볡ν©μ μΈ νμ λ€μ μ μνκΈ° μν 보νΈμ ꡬμ±(Universal Construction)μ λν΄μ λ°°μ λ μ μ΄ μλ€. ν¨μ νμ μ μ μνλ λ°λ λμΌν λ°©λ²μ μ¬μ©ν΄λ³Ό μ μλ€.
ν¨μ νμ μ μ μνκΈ° μν΄μλ ꡬμ±νλ €λ ν¨μ νμ , μΈμ νμ , κ²°κ³Ό νμ μ λͺ¨λ ν¬ν¨νλ ν¨ν΄μ΄ νμνλ€.
μ΄ μΈ κ°μ§ νμ
μ μ°κ²°νλ λͺ
νν ν¨ν΄μ ν¨μ μ μ©(Function application) λλ νκ°(Evaluation)μ΄λΌκ³ λΆλ¦°λ€. λ§μ½ ν¨μ νμ
μ νλ³΄μΈ λμμ z
λΌκ³ νκ³ μΈμ νμ
μΈ λμμ a
λΌκ³ ν λ, μ μ©(Application)μ μ΄ μμ κ²°κ³Ό νμ
μΈ λμ b
λ‘ λ§€ννλ νμμ΄λ€. μ¦, μ°λ¦¬μκ²λ μ΄ μΈ κ°μ§ λμμ΄ μμΌλ©°, μ΄ μ€ μΈμ νμ
κ³Ό κ²°κ³Ό νμ
λ κ°μ§λ κ³ μ λμ΄μλ κ²μ΄λ€.
μ°λ¦¬λ 맀νμΈ μ μ©λ κ°μ§κ³ μλ€. μ΄λ»κ² νλ©΄ μ΄ λ§€νμ μ΄ ν¨ν΄μ ν΅ν©ν μ μμκΉ? λ§μ½ μ°λ¦¬κ° λμ λ΄λΆλ₯Ό λ€μ¬λ€λ³Ό μ μλ€λ©΄, μ§ν© z
μ μμμΈ ν¨μ f
μ μ§ν© a
μ μμμΈ μΈμ x
λ₯Ό μ§μ§μ΄ μ§ν© b
μ μμμΈ f x
λ‘ λ§€νν μ μκ² λλ€.
그러면 이제 집합 b에서 원소 f x를 얻을 수 있게된다.
κ·Έλ¬λ μ΄λ κ² νλμ μμΈ (f, x)
λ₯Ό λ€λ£¨λ κ²λ³΄λ€λ ν¨μ νμ
z
μ μΈμ νμ
a
μ μ 체μ μΈ κ³±μ λν΄μ μ΄μΌκΈ°νλ κ²μ΄ λ μΌλ°νλ κ°λ
μΌ κ²μ΄λ€. κ³± zΓa
λν νλμ λμμ΄λ©°, μ΄ λμμμ b
λ‘μ νμ΄νμΈ μ°λ¦¬μ μ μ© λ³νμΌλ‘ g
λ₯Ό μ νν μ μλ€. Setμμλ g
κ° λͺ¨λ μ (f, x)
λ₯Ό f x
λ‘ λ§€ννλ ν¨μκ° λ κ²μ΄λ€.
λ λμ z
μ a
μ κ³±μ΄ μ¬μ g
μ μν΄ λ€λ₯Έ λμ b
λ‘ μ°κ²°λλ, μ΄κ²μ΄ λ°λ‘ ν¨ν΄μ΄λ€.
μ λ§ μ΄ ν¨ν΄μ΄ 보νΈμ ꡬμ±μ ν΅ν΄ ν¨μ νμ μ λͺ ννκ² μ μν μ μλ κ²μΌκΉ? μ¬μ€ λͺ¨λ μΉ΄ν κ³ λ¦¬μ λν΄μ μκ°ν΄λ³Έλ€λ©΄ κ·Έλ μ§ μμ μλ μλ€. νμ§λ§ μ°λ¦¬κ° μ§κΈ λ€λ£¨κ³ μ νλ μΉ΄ν κ³ λ¦¬μ λν΄μλ μΆ©λΆνλ€.
κ·Έλ λ€λ©΄ λ λ€λ₯Έ μ§λ¬Έμ ν΄λ³΄μ. κ³Όμ° μ°λ¦¬λ κ³±μ λ¨Όμ μ μνμ§ μκ³ λ ν¨μ λμμ μ μν μ μμκΉ? λͺ¨λ μμ λμμ λν΄ κ³±μ΄ μλ μΉ΄ν κ³ λ¦¬λ λͺ¨λ μμ κ³±μ΄ μ‘΄μ¬νμ§ μλ μΉ΄ν κ³ λ¦¬λ μμ§ μμκ°? μ λ΅μ βμλλ€βμ΄λ€. κ³± νμ μ΄ μλ€λ©΄ ν¨μ νμ λ μ‘΄μ¬ν μ μλ€. μ΄μ λν λ΄μ©μ μΆν μ§μ(Exponentials)μ λν΄ μ€λͺ νλ©° λ€μ λ€λ£¨λλ‘ νκ² λ€.
νλ² λ³΄νΈμ ꡬμ±μ λν΄ κ²ν ν΄λ³΄μ. μ°μ λμκ³Ό μ¬μμ ν¨ν΄μμλΆν° μμν κ²μ΄λ€. λ¬Όλ‘ κ·Έμ λμκ³Ό μ¬μμ ν¨ν΄μ΄λΌκ³ λ§ νλ©΄ κ΅μ₯ν λ§μ κ²°κ³Όκ° λ§€μΉλ κ²μ΄κΈ° λλ¬Έμ μ΄λλ‘λ μλΉν λΆμ νν 쿼리λΌκ³ ν μ μλ€.
Setμμλ κ±°μ λͺ¨λ κ²μ΄ μλ‘ μ°κ²°λμ΄μλ€. μ΄λ€ λμ z
μ λμ a
μ κ³±μ νμ±ν μλ μμΌλ©°, μ΄ κ³±μμ b
λ‘μ ν¨μλ μ‘΄μ¬ν μ μλ€. (λ¨, b
κ° λΉ μ§ν©μΌ κ²½μ°λ μ μΈνλ€.)
μ΄μ μ΄ ν¨ν΄μ κ²°κ³Όλ€μ λν μμλ₯Ό 맀긴λ€λ λΉλ°λ¬΄κΈ°λ₯Ό κΊΌλ΄λ³Ό μ°¨λ‘μ΄λ€. μΌλ°μ μΌλ‘ ν보 λμλ€ μ¬μ΄μλ μ΄ κ΅¬μ±μ μ΄λ€ λ°©μμ΄λ‘λ λΆν΄ν μ μλ κ³ μ ν 맀νμ΄ μμ΄μΌ νλ€.
νμλ z
μ zΓa
μμ b
λ‘ ν₯νλ μ¬μ g
κ° z'
μ μ΄μ μ μ©λλ μ¬μ gβ
λ³΄λ€ μ°μνλ€κ³ κ²°μ ν κ²μ΄λ€. κ·Έλ¦¬κ³ λ§μ½ μ΄ κ²°μ μ΄ μ°Έμ΄λΌλ©΄ z'
μμ z
λ‘ ν₯νλ μ μΌν μ¬μ h
μ΄ μ‘΄μ¬ν΄μΌ ν κ²μ΄λ€. κ·Έλ¦¬κ³ μ΄ μ¬μμ g'
λ₯Ό μ μ©ν κ²°κ³Όμ g
λ₯Ό μ μ©ν κ²°κ³Όκ° λμΌνλ€λ κ² λν 보μ₯ν΄μΌνλ€. (μ μ΄ν΄λμ§ μλλ€λ©΄ μλ κ·Έλ¦Όμ 보면μ μ΄ λ¬Έμ₯μ μ½μ΄λ³΄μ.)
μ¬κΈ°κ° μ‘°κΈ μ΄λ €μ΄ λΆλΆμΈλ°, μ΄κ² λ°λ‘ νμκ° μ΄ λ³΄νΈμ ꡬμ±μ λν μ μλ₯Ό κ³μ μ§μ§ λκ³ μλ μ΄μ μ΄λ€. μ¬μ 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
κ° κ°μ₯ μ ν©ν ν보λΌκ³ ν μ μμ κ²μ΄λ€.
νλ² μ 리ν΄λ³΄μ.
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 μ§ν©μΈ μλ λνμ΄λ€.
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 ννλ‘ μ μλ νμ
μλ μΌλ§λ λ§μ κ°μ΄ μ‘΄μ¬νλ κ²μΌκΉ? μ ννκ² κ°μ΄λ€. μ΄λ char
μμ bool
λ‘ ν₯νλ μλ‘ λ€λ₯Έ ν¨μλ€μ κ°μμλ λμΌνλ©°, κ° ν¨μλ κ³ μ ν 256 ννμ ν΄λΉλλ€.
λΉμ·ν λ°©μμΌλ‘ bool
μμ char
λ‘ ν₯νλ ν¨μμ κ°μλ κ³μ°ν΄λ³΄λ©΄ κ°λΌλ μ¬μ€μ μ μ μλ€. ν¨μ νμ
μ λν μ§μ νκΈ°λ²μ μ΄λ° μλ―Έλ₯Ό κ°μ§κ³ μλ κ²μ΄λ€.
μλ§ μ°λ¦¬λ int
λ double
μμ μΆλ°νλ ν¨μλ₯Ό λͺ¨λ λ©λͺ¨μμ΄μ¦νκ³ μΆμ΄νμ§λ μμ κ²μ΄λ€. νμ§λ§ λΉλ‘ μ€μ©μ μ΄μ§ μλλΌλ ν¨μμ λ°μ΄ν° νμ
μ¬μ΄μ λλ±μ±μ λͺ
νν μ‘΄μ¬νλ€.
κ·Έλ¦¬κ³ λ¦¬μ€νΈ, νΈλ¦¬, λ¬Έμμ΄κ³Ό κ°μ 무νν νμ λ μλ€. μ΄λ¬ν νμ μμ μΆλ°νλ ν¨μλ₯Ό λ©λͺ¨μμ΄μ¦νκΈ° μν΄μλ 무νν μ μ₯ 곡κ°μ νμλ‘ νλ€.
κ·Έλ¬λ Haskellμ κ²μΌλ₯Έ μΈμ΄μ΄λ―λ‘, κ²μΌλ₯΄κ² νκ°λλ 무νν λ°μ΄ν° ꡬ쑰μ ν¨μ μ¬μ΄μ κ²½κ³λ λͺ¨νΈνκ² λ€κ°μ¨λ€. μ΄λ¬ν ν¨μμ λ°μ΄ν° κ°μ μλμ±μ ν¨μ νμ μ μΉ΄ν κ³ λ¦¬λ‘ μ μ§μ λμκ³Ό λμΌμ ν μ μλ€λ κ²μ μ€λͺ νλ€. μ΄λ¬ν νΉμ±μ μ°λ¦¬κ° κ°μ§ λ°μ΄ν°μ λν κ°λ κ³Όλ μΌμΉνκΈ° λλ¬Έμ Haskellμμλ ν¨μλ₯Ό λ°μ΄ν°μ²λΌ μ·¨κΈν μ μλ€.
9.4 λ°μΉ΄λ₯΄νΈ λ«ν μΉ΄ν κ³ λ¦¬(Cartesian Closed Categories)
λ¬Όλ‘ νμλ κ³μ μ§ν©μ μΉ΄ν κ³ λ¦¬λ₯Ό νμ κ³Ό ν¨μμ λͺ¨λΈλ‘ μ¬μ©ν κ²μ΄μ§λ§, μ΄λ° λͺ©μ μΌλ‘ μ¬μ©ν μ μλ λ ν° μΉ΄ν κ³ λ¦¬ ν¨λ°λ¦¬κ° μλ€λ κ²μ μΈκΈνλ κ²μ μΆ©λΆν κ°μΉκ° μμ κ² κ°λ€. μ΄λ° μΉ΄ν κ³ λ¦¬λ λ°μΉ΄λ₯΄νΈ λ«ν μΉ΄ν κ³ λ¦¬(Cartesian closed categories)λΌκ³ νλ©°, Setμ κ·Έμ μ΄ μΉ΄ν κ³ λ¦¬ μ€ νλμ μμΌ λΏμ΄λ€.
λ°μΉ΄λ₯΄νΈ λ«ν μΉ΄ν κ³ λ¦¬λ μλ μΈ κ°μ§λ₯Ό λ°λμ ν¬ν¨νκ³ μμ΄μΌ νλ€.
- μ’ κ²° λμ
- μ΄λ€ λ λμμ κ³±
- μ΄λ€ λ λμμ μ§μ
μ§μλ₯Ό 무νν λ§μ νμλ‘ λ°λ³΅λλ κ³±μ΄λΌκ³ κ°μ£Όνλ€λ©΄, λ°μΉ΄λ₯΄νΈ λ«ν μΉ΄ν κ³ λ¦¬λ μμμ νμλ₯Ό μ§μνλ κ²μ΄λΌκ³ μκ°ν μ μλ€. νΉν μ’ κ²° λμμ κ³±μ νλ±μ(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μΉ
μΉ΄ν
κ³ λ¦¬μ ν΄μμμ μ°λ¦¬λ 0μ μ΄κΈ° λμμΌλ‘, 1μ μ’
κ²° λμμΌλ‘, κ·Έλ¦¬κ³ λ±μμ λνμ¬μμΌλ‘ λ체νλ€. μ¬κΈ°μ μ§μλ λ΄λΆ Hom λμμ μλ―ΈνκΈ° λλ¬Έμ κ²°κ΅ μ΄λΌλ μμ μ΄κΈ° λμμμ μμμ λμ a
λ‘ ν₯νλ μ¬μμ μ§ν©μ λνλΈλ€. μ΄κΈ° λμμ μ μμ λ°λΌ μ΄λ° μ¬μμ μ νν νλλ§ μ‘΄μ¬ν μ μμΌλ―λ‘ Hom μ§ν© λ λ¨μΌ μμ μ§ν©μ΄λ€.
λ¨μΌ μμ μ§ν©μ Setμμμ μ’ κ²° λμμ΄λ―λ‘, μ΄ νλ±μμ Setμμ μ½κ² μ±λ¦½ν μ μλ€. μ¬κΈ°μ μ€μν κ²μ μ΄ νλ±μμ΄ μ΄μ€ λ°μΉ΄λ₯΄νΈ λ«ν μΉ΄ν κ³ λ¦¬μ λͺ¨λ κ²½μ°μ λν΄μ μ±λ¦½νλ€λ κ²μ΄λ€.
Haskellμμλ 0μ Void
λ‘, 1μ μ λ νμ
μΈ ()
μΌλ‘ λ체νλ€. κ²°κ΅ νμκ° μμμ νλ μ£Όμ₯μ Void
μμ μμμ νμ
a
λ‘ ν₯νλ ν¨μμ μ§ν©μ΄ μ λ νμ
κ³Ό λλ±νλ€λ κ²μ΄λ€. λ€μ λ§νμλ©΄ Void -> a
ν¨μλ νλλΏμ΄λΌλ κ²μ΄λ€. κ·Έλ¦¬κ³ μ°λ¦¬λ μ΄λ―Έ μ΄ ν¨μλ₯Ό μμ μ λ³Έ μ μ΄ μλ€. λ°λ‘ absurd
ν¨μμ΄λ€.
κ·Έλ¬λ μ΄κ²μ νμ€μ ꡬννκΈ°λ μ½κ° κΉλ€λ‘λ€. μ΄μ λ ν¬κ² λ κ°μ§μΈλ°, μ²«μ§Έλ‘ Haskellμμλ μ€μ λ‘ μ΄λ€ κ°λ μνμ§ μλ νμ
μ΄λΌλκ² μ‘΄μ¬νμ§ μλλ€. λͺ¨λ νμ
μ βλλμ§ μλ κ³μ°μ κ²°κ³Όβ λλ Bottom(_|_
)μ ν¬ν¨νκΈ° λλ¬Έμ΄λ€.
λλ²μ§Έ μ΄μ λ absurd
μλ μ΄λ€ κ°λ μ λ¬ν μ μκΈ° λλ¬Έμ λκ° λ¬΄μ¨ μ§μ νλ κ²°κ΅ μ무λ μ€νμν¬ μ μλ€λ μ μ΄λ€. κ²°κ΅ μ΄ ν¨μμ ꡬνμ κ·Όλ³Έμ μΌλ‘ λͺ¨λ λλ±νλ€λ κ²μ΄λ€. κ·Έλ λ€κ³ ν΄μ λ§μ½ μμν λλμ§ μλ κ³μ°μ μ λ¬νλ€λ©΄ μ΄ ν¨μλ κ²°μ½ λ°νμ΄λΌλ νμκΉμ§ λλ¬νμ§ λͺ»ν κ²μ΄λ€.
9.5.2 1μ μ§μ
μ μμ Setμμ ν΄μλ λ λͺ¨λ λμμμ μ’
κ²° λμμΌλ‘ ν₯νλ κ³ μ ν μ¬μμ΄ μ‘΄μ¬νλ€λ μ’
κ²° λμμ λν μ μλ₯Ό λ€μ νλ² νννκ³ μλ€. μΌλ°μ μΌλ‘ a
μμ μ’
κ²° λμμΌλ‘ ν₯νλ λ΄λΆ Hom λμμ μ’
κ²° λμκ³Ό λνμ΄λ€.
Haskellμμ μμμ νμ
a
μμ μ λμΌλ‘ ν₯νλ ν¨μλ a -> ()
λ¨ νλ λΏμ΄λ€. μ°λ¦¬λ μ΄ ν¨μλ₯Ό unit
μ΄λΌκ³ λΆλ₯Έλ€λ κ²μ μ΄λ―Έ μκ³ μλ€. μ΄ ν¨μλ ()
μ λΆλΆ μ μ©λ const
ν¨μλ‘ μκ°ν μλ μλ€.
9.5.3 1μΉ
μ μμ μ’
κ²° λμμΌλ‘λΆν° μΆλ°νλ μ¬μμ λμ a
μ μμλ₯Ό μ ννλλ° μ¬μ©λ μ μλ€λ κ²μ λ€μ ννν κ²μ΄λ€. μ΄λ¬ν μ¬μλ€μ μ§ν©μ λμ μ체μ λνμ΄λ€. Set, κ·Έλ¦¬κ³ Haskellμμλ μ§ν© a
μ μμλ€κ³Ό ν΄λΉ μμλ€μ μ ννλ ν¨μλ€μΈ () -> a
κ° λνμ΄λΌλ κ²μ΄λ€.
9.5.4 μ§μμ ν©
μΉ΄ν κ³ λ¦¬λ‘ μ μΌλ‘ μ μμ λμμ λ μ§μμ ν©μ΄ κ° μ§μλ₯Ό κ°μ§ λμλ€μ κ³±κ³Ό λνμ΄λΌλ κ²μ μλ―Ένλ€.
μ΄ λμμ λνμ±μ 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 μ§μμ μ§μ
μ μμ μ§μ λμλ€μ λν 컀λ§(Currying)μ νννκ³ μλ€. ν¨μκ° ν¨μλ₯Ό λ°ννλ κ²μ κ³±μμ μΆλ°νλ ν¨μ, μ¦ μ΄λ³μ ν¨μμ λλ±νλ€.
9.5.6 κ³±μ μ§μ
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μμ 곡μμ μΌλ‘ λμ λκ³ μλ€.
μ΄μ²λΌ μ»΄ν¨ν°λ μ¬λ¬ λ°©λ©΄μμ μΈμμ νμ νκ³ μλ€.
κ΄λ ¨ ν¬μ€ν 보λ¬κ°κΈ°
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 10. μμ° λ³ν
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 8. νν°μ νΉμ±
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 7. νν°
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 6. λ¨μν λμμ νμ
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 5. κ³±κ³Ό ν©