[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 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)
μ κ°μ ννλ₯Ό κ°μ§κ³ μλ€.
μλ¬Έ 보기
κ΄λ ¨ ν¬μ€ν 보λ¬κ°κΈ°
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 10. μμ° λ³ν
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 9. ν¨μ νμ
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 8. νν°μ νΉμ±
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 7. νν°
[λ²μ] νλ‘κ·Έλλ¨Έλ₯Ό μν μΉ΄ν κ³ λ¦¬ μ΄λ‘ - 6. λ¨μν λμμ νμ