-
[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 κΉμ§ μ λλ€!
- GHCi μμ :t λ‘ νμ μμ보기
- ν¨μ Typeμ μ μΈνκΈ°
- νμ λ³μ. (νμ€μΌ κ³μ μ λ€λ¦ μ¬μ©λ²?)
- νμ€μΌμ μΌλ°μ μΈ νμ λ€
- Type Class
- νμ€μΌμμ λ§μ΄ μ°λ Type Class λ€
- λ§λ¬΄λ¦¬
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 :: Integer3. νμ λ³μ
μκΉ μ , 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 :: IntegerFloat
νλμ μμμ μ κ°μ§ λΆλμμμ μλΌκ³ ν©λλ€.
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.84955592153876Bool
True, Falseλ‘ ννλλ λΆμΈλ¦¬μΈ κ°μ λλ€.
Char
μ λ μ½λ λ¬Έμμ λλ€.
Tuple
Tupleμ νμ μ μ¬μ€μ μ‘°ν©μ λ°λΌ 무ννλ€κ³ ν©λλ€. () < λΉ Tuple λ νμ μ€μ νλλΌκ³ ν΄μ!
λ€μ μκ°μλ 4λ² Type Class λΆν° μ 리νλλ‘ ν κ²μ! κ±°κΈ°μ λΆν° μμ΄ λ§μμ γ γ ...
μΌμμ... μ€λλ μ 리νλ€ λ³΄λ μ λ§ λ§λ€μ¬... :( μ΄λ»κ² νλ©΄ μ μ 리ν μ μλμ§ λ§€λ² κ³ λ―Όμ΄μμ
λ€μμ μ‘°κΈλ κ°λ¨νκ³ μ§§κ² μ 리ν΄λ³Όκ²μ!
μ¬μ€... λ€μ μ₯μΈ 3μ₯ ν¨μμ ꡬ문κΉμ§ μ½μλλ°... κ±°κΈ°μλΆν° ν¨ν΄ 맀μΉμ΄λ μ¬κ·λ₯Ό μ¬μ©ν΄μ HackerRank λ¬Έμ λ₯Ό ν μ μλ λ°λ³΅λ¬Έ λ±μ ꡬνν μ μκ±°λ μ... κ·Έλ°λ° μ λ¦¬κ° λ무 λ§μ λ―... μ΄μ 3μ₯ μ 리νκ³ μΆμ λ§μ λΏμ΄μμ γ γ γ γ
μ μμ½ν΄μ λ€μ μ₯ μ΄μ λκ° λ³Όκ²μ!! μ€λλ μ’μ λ°€ λμΈμ :)
'κ³΅λΆ > ν¨μν νλ‘κ·Έλλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Haskell] #6 syntax-in-functions (1) (0) 2020.01.27 [Haskell] #5 Type (2) (0) 2020.01.20 [Haskell] #3 Tuple (0) 2020.01.12 [Haskell] #2 List(2) Range, list comprehension (0) 2020.01.12 [Haskell] #1 List (1) κΈ°λ³Έμ μΈ μ°μ°λ€ (0) 2020.01.11