ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Haskell] #4 Type (1)
    곡뢀/ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 2020. 1. 19. 21:33

    이건 μ§€λ‚œ 편

    2020/01/12 - [곡뢀/ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°] - [Haskell] #3 Tuple

     

    λ‹€μŒ 편

    2020/01/20 - [곡뢀/ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°] - [Haskell] #5 Type (2)

     

    λ“œλ””μ–΄ μ„œλ¬Έμ— λ‚˜μ™”λ˜ ν•˜μŠ€μΌˆμ˜ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ κ°•λ ₯ν•œ Type μ‹œμŠ€ν…œμ— λŒ€ν•΄μ„œ λ°°μš°κ²Œλ˜λ„€μš”!

     

    • ν•˜μŠ€μΌˆμ˜ λͺ¨λ“  것듀은 Type μž…λ‹ˆλ‹€.
    • ν•˜μŠ€μΌˆμ€ 컴파일 μ‹œκ°„μ— λͺ¨λ“  νƒ€μž…μ„ μ•Œμ•„λ‚΄, λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό μ€„μž…λ‹ˆλ‹€.
    • ν•˜μŠ€μΌˆμ€ κ°•λ ₯ν•œ νƒ€μž… μΆ”λ‘  (Type Inference)λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. 

     

     

    이번 μž₯μ—μ„œ λ‹€λ£¨λŠ” λ‚΄μš©μ€ μ•„λž˜ λ‚΄μš© 쀑, 1-4 κΉŒμ§€ μž…λ‹ˆλ‹€!

     

    1. GHCi μ—μ„œ :t 둜 νƒ€μž… μ•Œμ•„λ³΄κΈ°
    2. ν•¨μˆ˜ Type을 μ„ μ–Έν•˜κΈ°
    3. νƒ€μž… λ³€μˆ˜. (ν•˜μŠ€μΌˆ κ³„μ˜ μ œλ„€λ¦­ μ‚¬μš©λ²•?)
    4. ν•˜μŠ€μΌˆμ˜ 일반적인 νƒ€μž…λ“€
    5. Type Class
    6. ν•˜μŠ€μΌˆμ—μ„œ 많이 μ“°λŠ” Type Class λ“€
    7. 마무리

    1. GHCi μ—μ„œ :t 둜 νƒ€μž… μ•Œμ•„λ³΄κΈ°

    ν•˜μŠ€μΌˆμ—μ„œ Type을 μ•Œμ•„λ³΄λŠ” λͺ…λ Ήμ–΄λŠ” :t μž…λ‹ˆλ‹€.

     

    그리고, :: νƒ€μž… < μ΄λ ‡κ²Œ νƒ€μž…μ„ 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    ν•˜μŠ€μΌˆμ—μ„œλŠ” Type을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” μ•žμ„ λŒ€λ¬Έμžλ‘œ μ”λ‹ˆλ‹€.

    κ·Έλž˜μ„œ 저희가 ν•¨μˆ˜μ˜ 이름을 λŒ€λ¬Έμžλ‘œ μ‹œμž‘ ν•  수 μ—†λŠ” κ±°μ—μš”!

     

    Prelude> :t ("hi", True)
    ("hi", True) :: ([Char], Bool) // ::λŠ” 이 λ‹€μŒμ—λŠ” νƒ€μž…μ΄ λ‚˜μ˜¨λ‹€λŠ” λœ»μž…λ‹ˆλ‹€. ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ •μ˜ν•  λ•Œλ„ μ“°μž…λ‹ˆλ‹€.

    Prelude> :t "helloworld"

    "helloworld" :: [Char]


    Prelude> :t 'h'

    'h' :: Char

    Prelude> :t head //ν•¨μˆ˜μ˜ νƒ€μž…λ„ λ°›μ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

    head :: [a] -> a //음? λŒ€λ¬Έμžκ°€ μ•„λ‹ˆμ£ ? 이 것은 νƒ€μž… λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ κ²ƒμž…λ‹ˆλ‹€. μ € aμ—λŠ” μ–΄λ–€ νƒ€μž…μ΄ 와도 λœλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€! 이건 쑰금 μžˆλ‹€κ°€ μ„€λͺ…ν• κ²Œμš”!

     

     

    2. ν•¨μˆ˜ Type μ„ μ–Έν•˜κΈ°

     

    :: μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄, ν•¨μˆ˜/객체의 Type을 미리 μ„ μ–Έν•˜κ³  ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

    ν•˜μŠ€μΌˆμ—μ„œλ„ ν•¨μˆ˜λ₯Ό μ„ μ–Έ ν•˜κ³  μ •μ˜ν•˜λŠ” 것이 쒋은 μŠ΅κ΄€μ΄λΌκ³  ν•˜λ„€μš”

     

    맀개 λ³€μˆ˜κ°€ 1개인 ν•¨μˆ˜ μ„ μ–Έ

    //ν•¨μˆ˜ μ„ μ–Έ
    removeNonUpperCase :: [Char] -> [Char] //1개인 경우 -> λ‹€μŒμ— 리턴값이 μ˜΅λ‹ˆλ‹€.

    //ν•¨μˆ˜ μ •μ˜
    removeNonUpperCase st = [c | c <- st, c `elem` ['A'..'Z']]

     λ§€κ°œλ³€μˆ˜κ°€ μ—¬λŸ¬ 개인 ν•¨μˆ˜ μ„ μ–Έ

    //ν•¨μˆ˜ μ„ μ–Έ
    addThree :: Int -> Int -> Int -> Int  // -> 둜 μ΄μ–΄μ„œ λ‚˜μ—΄ ν•©λ‹ˆλ‹€. λ§¨ λ§ˆμ§€λ§‰μ— μ˜€λŠ” νƒ€μž…μ΄ 리턴 κ°’μ˜ νƒ€μž…μ΄ λ©λ‹ˆλ‹€.
    //-> 의 λ‚˜μ—΄λ‘œ ν‘œν˜„ν•˜λŠ” μ΄μœ λŠ” λ‚˜μ€‘μ— 5μž₯μ—μ„œ λ‚˜μ˜¨λ‹€κ³  ν•˜λ„€μš”...
    // + 5μž₯의 μ»€λ¦¬λΌλŠ” κ°œλ… λ•Œλ¬Έμ— κ·Έλ ‡λ‹€κ³  ν•©λ‹ˆλ‹€! λ‚˜μ€‘μ— 링크λ₯Ό κ±Έμ–΄λ‘˜κ²Œμš”!

    //ν•¨μˆ˜ μ •μ˜
    addThree a b c = a + b + c

    addThree 1 2 3

    => 6

    νŠΉμ • νƒ€μž… 지정 ν•˜κΈ°


    Prelude> let a = 5 :: Integer // ::둜 μ •ν™•νžˆ μ–΄λ–€ Type을 μ‚¬μš©ν•  건지 지정할 수 μžˆμŠ΅λ‹ˆλ‹€!

    Prelude> let b = 1 :: Int

    Prelude> :t b //Int

    b :: Int


    Prelude> :t a //Integer

    a :: Integer

     

    3. νƒ€μž… λ³€μˆ˜

    μ•„κΉŒ μ „, head의 νƒ€μž…μ„ κΈ°μ–΅ν•˜μ‹œλ‚˜μš”?

    Prelude> :t head //ν•¨μˆ˜μ˜ νƒ€μž…λ„ λ°›μ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    head :: [a] -> a

     

    μ•„κΉŒ λΆ„λͺ… Type은 λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•œλ‹€λΌκ³  ν–ˆμ—ˆμ–΄μš”. 

    그런데 이 녀석은 μ•„λ‹ˆμ£ ! 그럼 aλŠ” νƒ€μž…μ΄ 될 수 μ—†λŠ”λ°...?

     

    사싀 이 녀석은 νƒ€μž… λ³€μˆ˜  Type Variable μž…λ‹ˆλ‹€.

    λͺ¨λ“  νƒ€μž…μœΌλ‘œ λŒ€μΉ˜ 될 수 μžˆμ–΄μš”. μžλ°”μ˜ Genericκ³Ό ν‘μ‚¬ν•œ κ°œλ…μΈ λ“― ν•©λ‹ˆλ‹€. 


    μ΄λ ‡κ²Œ νƒ€μž… λ³€μˆ˜λ₯Ό λ°›λŠ” ν•¨μˆ˜λ₯Ό λ‹€ν˜• ν•¨μˆ˜ (polymorphic function)이라고 ν•©λ‹ˆλ‹€. 객체 지ν–₯의 λ‹€ν˜•μ„±κ³Ό ν‘μ‚¬ν•˜λ„€μš”.

     

    사싀 a κ°€ μ•„λ‹ˆκ³  b, x, μ•„λ‹ˆλ©΄ 더 κΈ΄ 이름을 써도 λ˜μ§€λ§Œ, 보톡은 a, b, c, d둜 써도 λœλ‹€κ³  ν•©λ‹ˆλ‹€.

     

    headκ°€ Type Variable을 μ“°κ³  있기 떄문에, 저희가 μ•„λž˜μ™€ 같이 μ–΄λ–€ 값이 λ“€μ–΄κ°„ λ¦¬μŠ€νŠΈμ—μ„œλ„ headλ₯Ό μ“Έ 수 μžˆλŠ” κ²ƒμ΄λžλ‹ˆλ‹€.

    head [1,3,5] => 1
    head "hello" => 'h'

     

    νƒ€μž… λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜

    getFirst :: (first, b) -> first // νƒ€μž… 선언에 νƒ€μž… λ³€μˆ˜λ‘œ  first, bλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

    getFirst (a, b) = a

    getFirst ("a", 1) => "a"

     

    4 . 일반적인 ν•˜μŠ€μΌˆ νƒ€μž…

    저희가 μ‚¬μš©ν–ˆλ˜ 1, 'c', "μ•ˆλ…•" 같은 μžλ£Œν˜•λ“€λ„ λͺ¨λ‘ νƒ€μž…μ— μ†ν•˜μ£ .  λ¦¬λ§ˆμΈλ“œ ν•˜λŠ” λŠλ‚ŒμœΌλ‘œ κ°€λ³κ²Œ μ •λ¦¬ν• κ²Œμš”!

     

    Int

    Integer의 μ•½μžμ΄κ³ , μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ„ κ°–μŠ΅λ‹ˆλ‹€. λ²”μœ„λŠ” 컴파일러둜 GHCλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ»΄ν“¨ν„°μ˜ 기계어 크기둜 정해진닀고 ν•©λ‹ˆλ‹€. 64bit CPUλ₯Ό μ“΄λ‹€λ©΄ -2^63 ~ 2^61 - 1 κΉŒμ§€!

     

    Integral

    Int와 κ°™μ§€λ§Œ, 이 것은 ν‘œν˜„ ν•  수 μžˆλŠ” μˆ˜μ— ν•œκ³„κ°€ μ—†λ‹€κ³  ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 도리어 κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Intκ°€ 더 효율적이라고 ν•˜λ„€μš”.

     

    Prelude> let a = 5 :: Integer // ::둜 μ •ν™•νžˆ μ–΄λ–€ Type을 μ‚¬μš©ν•  건지 지정할 수 μžˆμŠ΅λ‹ˆλ‹€!
    Prelude> let b = 1 :: Int
    Prelude> let c = 1 

    Prelude> :t c
    c :: Num p => p //Num은 이 λ‹€μŒμ— μ„€λͺ…ν•  νƒ€μž… 클래슀 쀑 ν•˜λ‚˜μΈ Num μž…λ‹ˆλ‹€. μžλ™μœΌλ‘œλŠ” μ΄λ ‡κ²Œ μ§€μ •ν•΄μ£Όλ‚˜ λ³΄λ„€μš”... 흠..

    Prelude> :t b //Int
    b :: Int

    Prelude> :t a //Integer
    a :: Integer

    Float

    ν•˜λ‚˜μ˜ μ†Œμˆ˜μ μ„ 가진 λΆ€λ™μ†Œμˆ˜μ  수라고 ν•©λ‹ˆλ‹€.

     

    Double

    Floatκ³Ό κ°™μ§€λ§Œ, 정밀도가 2λ°° μž…λ‹ˆλ‹€. 

    circumference1 :: Double -> Double
    circumference1 r = 2 * pi *r

    circumference2 :: Float -> Float 
    circumference2 r = 2 * pi *r


    circumference1 3  //Float
    => 18.849556


    circumference2 3 //Double
    => 18.84955592153876

    Bool

    True, False둜 ν‘œν˜„λ˜λŠ” λΆ€μšΈλ¦¬μ–Έ κ°’μž…λ‹ˆλ‹€.

     

    Char

    μœ λ‹ˆ μ½”λ“œ λ¬Έμžμž…λ‹ˆλ‹€.

     

    Tuple

    Tuple의 νƒ€μž…μ€ 사싀상 쑰합에 따라 λ¬΄ν•œν•˜λ‹€κ³  ν•©λ‹ˆλ‹€. () < 빈 Tuple 도 νƒ€μž… 쀑에 ν•˜λ‚˜λΌκ³  ν•΄μš”!

     

    λ‹€μŒ μ‹œκ°„μ—λŠ” 4번 Type Class λΆ€ν„° μ •λ¦¬ν•˜λ„λ‘ ν• κ²Œμš”! κ±°κΈ°μ„œ λΆ€ν„° 양이 λ§Žμ•„μ„œ γ…Žγ…Ž...

     

    μœΌμ•„μ•„... μ˜€λŠ˜λ„ μ •λ¦¬ν•˜λ‹€ λ³΄λ‹ˆ 정말 λ§Žλ„€μ—¬... :( μ–΄λ–»κ²Œ ν•˜λ©΄ 잘 정리할 수 μžˆλŠ”μ§€ 맀번 κ³ λ―Όμ΄μ—μš”

     

    λ‹€μŒμ—” μ‘°κΈˆλ” κ°„λ‹¨ν•˜κ³  짧게 μ •λ¦¬ν•΄λ³Όκ²Œμš”! 

     

    사싀...  λ‹€μŒ μž₯인 3μž₯ ν•¨μˆ˜μ˜ κ΅¬λ¬ΈκΉŒμ§€ μ½μ—ˆλŠ”λ°... κ±°κΈ°μ„œλΆ€ν„° νŒ¨ν„΄ λ§€μΉ­μ΄λž‘ μž¬κ·€λ₯Ό μ‚¬μš©ν•΄μ„œ HackerRank 문제λ₯Ό ν’€ 수 μžˆλŠ” 반볡문 등을 κ΅¬ν˜„ν•  수 μžˆκ±°λ“ μš”... 그런데 정리가 λ„ˆλ¬΄ λ§Žμ€ λ“―... μ–΄μ„œ 3μž₯ μ •λ¦¬ν•˜κ³  싢은 마음 λΏμ΄μ—μš” γ…‹γ…‹γ…‹γ…‹ 

     

    잘 μš”μ•½ν•΄μ„œ λ‹€μŒ μž₯ μ–΄μ„œ λ‚˜κ°€ λ³Όκ²Œμš”!! μ˜€λŠ˜λ„ 쒋은 λ°€ λ˜μ„Έμš” :)

    λŒ“κΈ€

Designed by Tistory. @Bola Kim