More Related Content Similar to Haskell study 3
Similar to Haskell study 3 (7) More from Nam Hyeonuk (17) Haskell study 32. Type
Haskellμ μμμλ μ΄μΌκΈ°νλ―μ΄ μ μ νμ
μΈμ΄μ
λλ€. Haskellμ λͺ¨λ ννμλ€μ μ»΄νμΌ νμμ
νμ
μ΄ λμ§ μ μ μμ΄μΌλ§νκ³ , μ΄λ° νΉμ±μ μ»΄νμΌ νμμ κ΅μ₯ν λ§μ λ²κ·Έλ₯Ό μ‘μ μ μκ² ν΄
μ€λλ€. GHCiμμ :t 컀맨λλ₯Ό ν΅ν΄ ννμμ νμ
μ νμΈν μ μμ΅λλ€.
Prelude> :t 'a'
'a' :: Char
Prelude> :t True
True :: Bool
Prelude> :t "Hello!"
[Char]
Prelude> :t (True, 'a')
(True, 'a') :: (Bool, Char)
3. Type
νμ
μ ννμ λ€μ ::(has type of λΌκ³ μ½μ΅λλ€) κΈ°νΈμ ν¨κ» νκΈ°λ©λλ€. μμμ λ΄€λ―μ΄ 'a'λ
Char νμ
μ κ°κ³ , Trueλ Bool νμ
, "Hello!"λ [Char] νμ
(Stringκ³Ό λμμ΄ - λ¬Έμμ΄μ λ¬Έμμ
listμ£ ), ννμ κ·Έ ννμ μ΄λ£¨λ μμλ€μ νμ
μ λ°λΌ νμ
μ΄ κ²°μ λ©λλ€. ('a','b','c')κ°μ 건
(Char, Char, Char) νμ
μ κ°κ² μ£ . λΉμ°ν μ΄μΌκΈ°μ§λ§ ν¨μμλ νμ
μ΄ μμ΅λλ€.
first.hs
-- μ°μ΅λ¬Έμ λ° μμ μμ λ€λ€λ ν¨μλ€μ
λλ€. Haskellμμ μ£Όμμ --λ‘ νκΈ°ν©λλ€.
-- ν¨μμ νμ
μ μΈμμ μΈμμ 리ν΄κ°μ νμ
μ ꡬλΆνμ¬ νκΈ°νμ§ μμ΅λλ€.
-- λͺ¨λ -> κΈ°νΈλ₯Ό ν΅ν΄ μ°μμ μΌλ‘ νκΈ°ν©λλ€.
even' :: Int -> Bool -- evenμ Int νλλ₯Ό λ°μ Bool νλλ₯Ό 리ν΄ν©λλ€.
even' n = n `mod` 2 == 0
double2 :: Int -> Int -> Int -- double2λ Int 2κ°λ₯Ό μΈμλ‘ λ°μ Intλ₯Ό 리ν΄ν©λλ€.
double2 x y = double x + double y
4. Type
Haskellμ μλ λͺ κ°μ§ νμ
λ€μ μ΄ν΄λ΄
μλ€.
β’ Int
μ μλ₯Ό λνλ΄λ λνμ μΈ νμ
μ
λλ€. -2147483648 ~ 2147483647 κΉμ§ λ²μμ μ μλ€μ
ννν μ μμ΅λλ€.
β’ Integer
μμ μ μλ₯Ό λνλ΄λ νμ
μ
λλ€. λ¨, μ΄ νμ
μ μ«μ λ²μμ νκ³κ° μμ΅λλ€. λΉμ°ν μ΄μΌκΈ°μ§λ§ Int
λ³΄λ€ μ‘°κΈ λ리긴 ν©λλ€.
β’ Float
λ³΄ν΅ μ λ°λ(single precision)μ λΆλ μμμ μμ
λλ€.
5. Type
β’ Double
Single λ³΄λ€ λ μ λ°ν(double precision) λΆλ μμμ μμ
λλ€.
β’ Bool
λ
Όλ¦¬ νμ
μ
λλ€. True λλ FalseλΌλ λ κ°μ κ°μ κ°μ§κ³ μμ΅λλ€.
β’ Char
λ¬Έμλ₯Ό λνλ
λλ€. νλ°μ΄ν(')λ‘ κ°μΌ νλμ λ¬Έμμ ννλ‘ νκΈ°ν©λλ€.
β’ Tuple
ννμ κ΅¬μ± μμμ λ°λΌ κ΅μ₯ν λ§μ μ’
λ₯μ νμ
μ΄ μ‘΄μ¬ν©λλ€. ν κ°μ§ νΉμ§μ μΈ κ²μ λΉ νν ()
λν νμ
μ΄λ©° μ΄ νμ
μ κ°μ () νλ λ°μ μ‘΄μ¬νμ§ μλλ€λ κ²μ
λλ€.
6. Type variable
λ€λ₯Έ μΈμ΄μ μ λ€λ¦μ΄λ ν
νλ¦Ώκ³Ό λΉμ·ν κ°λ
μΌλ‘ Haskellμλ νμ
λ³μλΌλ κ²μ΄ μμ΅λλ€.
리μ€νΈμ 첫 λ²μ§Έ μμλ₯Ό κ°μ Έμ€λ head ν¨μμ νμ
μ λκΉμ?
Prelude> :t head
head :: [a] -> a
headμ νμ
μ [a] -> aμ
λλ€. head ν¨μλ μμ νμ
(a)μ 리μ€νΈ([a])λ₯Ό μΈμλ‘ λ°μ ν΄λΉ μμ
νμ
(a)μ κ° νλλ₯Ό λ°ννλ ν¨μλΌλ μλ―Έμ£ . μ΄ λ head νμ
μ μΈμ λνλ βaβμ κ°μ΄ μμ
νμ
μ λμλ μ μλ κ²μ βνμ
λ³μβλΌκ³ ν©λλ€. Haskellμ λͺ¨λ νμ
μ λλ¬Έμλ‘ μμνλ λ°λ©΄
νμ
λ³μλ νμ
μ΄ μλλΌ νμ
βλ³μβκΈ° λλ¬Έμ μλ¬Έμλ‘ μμνμ£ . κΌ ν κΈμμΌ νμλ μμ§λ§ 보ν΅
ν κΈμλ‘ λ§μ΄ μλλ€.
7. Type variable
Prelude> :t fst
fst :: (a,b) -> a
fst ν¨μλ λ κ°μ μμ νμ
μ μμλ‘ κ°μ§ ννμ μΈμλ‘ λ°μ κ·Έ ννμ 첫 λ²μ§Έ μμμ κ°μ νμ
μ
κ°μ§ κ°μ λ°ννλ ν¨μμ
λλ€. μ΄ λλ¬Έμ fstλ₯Ό 2κ°λ³΄λ€ λ§μ μμλ₯Ό κ°μ§ ννμ μΈ μ μμ£ .
νμ
λ³μλ₯Ό μ¬μ©νλ λ€λ₯Έ ν¨μλ€μ νμ
λ μμ μΌμ ν λ² νμΈν΄λ΄
μλ€.
Prelude> :t zip
zip :: [a] -> [b] -> [(a,b)]
Prelude> :t length
length :: [a] -> Int
8. Type Class
Haskellμλ νμ
ν΄λμ€λΌλ κ°λ
μ΄ μμ΅λλ€. μ΄λ¦μ βν΄λμ€βλΌλ λ§μ΄ λ€μ΄κ° μμ΄μ μ‘°κΈ ν·κ°λ¦΄
μ μμ§λ§, Haskellμ νμ
ν΄λμ€λ ν μΈμ΄μ ν΄λμ€μλ μλ¬΄λ° κ΄λ ¨μ΄ μμ΅λλ€. μ€νλ € λ°μ§μλ©΄
μΈν°νμ΄μ€μ κ°λ
μ λ κ°κΉμ΅λλ€. μμλ₯Ό μν΄ == ν¨μμ νμ
μ νμΈν΄ λ΄
μλ€.
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
κΈ°νΈ => μμ κ²μ ν΄λμ€ μ μ½(class constraint)μ΄λΌκ³ λΆλ¦
λλ€. μ΄λ νμ
λ³μ aκ° νμ
ν΄λμ€ Eqμ μνλ κ²½μ°μλ§ == ν¨μλ₯Ό μΈ μ μλ€λ λ»μ΄μ£ . μλ‘ κ°μμ§ λ€λ₯Έμ§ λΉκ΅ν μ μλ
νμ
μ΄λΌλ©΄ νμ
ν΄λμ€ Eqμ μν΄μΌν©λλ€.
9. Type Class
Prelude> :t elem
elem :: Eq a => a -> [a] -> Bool
elemν¨μλ λ΄λΆμ μΌλ‘ 리μ€νΈμ μνλ μμμΈμ§ μλμ§λ₯Ό νλ³νκΈ° μν΄ == ν¨μλ₯Ό μ΄μ©ν©λλ€.
κ·Έλμ elem ν¨μλ Eq νμ
ν΄λμ€μ μν νμ
μκ²λ§ μ¬μ©ν μ μμ΅λλ€.
Haskellμλ κΈ°λ³Έμ μΌλ‘ μ μλ μ¬λ¬ κ°μ§ νμ
ν΄λμ€λ€μ΄ μμ΅λλ€. κ° νμ
ν΄λμ€λ€μ νΉμ§μ
νλμ© μ΄ν΄λ΄
μλ€.
10. Type Class
Eq
μλ‘ κ°μμ§ λ€λ₯Έμ§ νλ³ν μ μλ νμ
λ€μ μν΄ μ‘΄μ¬ν©λλ€. μ΄ νμ
ν΄λμ€μ λ©€λ²λΌλ©΄ == ν¨μμ
/= ν¨μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
Ord
Ordλ μμλ₯Ό κ°μ§ νμ
λ€μ μν νμ
ν΄λμ€μ
λλ€. μ΄ νμ
ν΄λμ€λ >, <, >=, <= λ±μ ν¨μλ₯Ό
μ 곡ν©λλ€. λ compare ν¨μ(μμ΄ λ€λ³΄λ€ ν¬λ©΄ GT, κ°μΌλ©΄ EQ, μμΌλ©΄ LT λ°ν)λ₯Ό μ 곡ν©λλ€.
Ord νμ
ν΄λμ€μ λ©€λ²κ° λλ €λ©΄ λ°λμ Eq νμ
ν΄λμ€μ μν΄μΌλ§ ν©λλ€.
Prelude> 5 `compare` 3
GT
Prelude> "abcd" < "efgh"
True
11. Type Class
Show
μ΄ νμ
ν΄λμ€μ λ©€λ²λ λ¬Έμμ΄λ‘ λ³νν μ μμ΅λλ€. show ν¨μλ Show νμ
ν΄λμ€μ μνλ
νμ
κ° νλλ₯Ό λ°μμ κ·Έκ±Έ λ¬Έμμ΄λ‘ λ³νν΄μ€λλ€.
Prelude> show 3
"3"
Prelude> show 5.334
"5.334"
Prelude> show True
"True"
12. Type Class
Read
Readλ Showμ λ°λλλ νμ
ν΄λμ€λΌκ³ λ³Ό μ μμ΅λλ€. μ΄ νμ
ν΄λμ€μ μν κ°λ€μ
λ¬Έμμ΄λ‘λΆν° ν΄λΉ νμ
μ κ°μ λ§λ€μ΄λΌ μ μμ΅λλ€. μ΄ λ read ν¨μλ₯Ό μλλ€.
Prelude> read "True" || False
True
Prelude> read "[1,2,3,4]" ++ [3]
[1,2,3,4,3]
Prelude> read "4" + 5
9
13. Type Class
Read
νμ§λ§ read ν¨μλ κ·Έλ₯ κ·Έ ν¨μλ§ κ°μ§κ³ λ μ¬μ©ν μ μμ΅λλ€. read "4"μ κ°μ μμμ, Haskell
μ μ΄κ±Έ μ΄λ€ νμ
μ κ°μΌλ‘ λ°κΏμΌν μ§ μμλΌ μ μκΈ° λλ¬Έμ΄μ£ . λ°λ©΄μ read "4" + 5μ κ°μ΄
νμ
μ μΆλ‘ ν μ μλ μμ μΌλΆλ‘ μ¬μ©ν κ²½μ° read "4"λ₯Ό 4λ‘ λ°κΏμΌ 4 + 5 κ³μ°μ΄ κ°λ₯νλ€λ
μ μΌλ‘λΆν° Haskellμ΄ νμ
μ μΆλ‘ ν΄ λΌ μ μκΈ° λλ¬Έμ μ΄λ΄ λλ μ¬μ©μ΄ κ°λ₯ν©λλ€. λ§μ½ read
ν¨μλ₯Ό λ¨λ
μΌλ‘ μ°κ³ μΆλ€λ©΄ κ·Έ λλ λ³ννκ³ μ νλ κ°μ νμ
μ ::(type annotation)μ μ΄μ©ν΄
λͺ
μν΄μ£Όμ΄μΌ ν©λλ€.
Prelude> read "4" :: Int
4
Prelude> read "[1,2,3,4]" :: [Int]
[1,2,3,4]
14. Type Class
Enum
Enumμ μ΄κ±°λ μ μλ νμ
λ€μ μν νμ
ν΄λμ€ μ
λλ€. Enum νμ
ν΄λμ€μ μν νμ
λ€μ
κ²½μ° κ°κ° μμ μ μ΄μ κ°κ³Ό λ€μ κ°μ κ°μ Έμ€λ pred, succ ν¨μλ₯Ό μΈ μ μμΌλ©° 리μ€νΈ λ²μ(list
range)λ₯Ό μ΄μ©ν μ μλ€λ μ₯μ μ΄ μμ΅λλ€.
Prelude> ['a'..'e']
"abcde"
Prelude> [LT..GT]
[LT, EQ, GT]
Prelude> succ 'B'
'C'
15. Type Class
Bounded
μ΄ νμ
ν΄λμ€μ λ©€λ²λ€μ μνμ κ³Ό ννμ μ κ°κ³ μμ΅λλ€.
Prelude> minBound :: Int
-2147483648
Prelude> maxBound :: Bool
True
Prelude> minBound :: Char
'NUL'
16. Type Class
Num
μ΄ νμ
ν΄λμ€μ λ©€λ²λ€μ μ«μμ²λΌ λμν μ μμ΅λλ€.
Prelude> :t 20
20 :: Num a => a
μ«μ 리ν°λ΄μ κ·Έ μμ²΄λ‘ λ€νμ μΈ νμ
μ²λΌ λμν©λλ€. μ«μ 리ν°λ΄μ Num νμ
ν΄λμ€μ μνλ
λͺ¨λ νμ
μ λν΄ κ·Έ νμ
μ²λΌ λμν μ μμ΅λλ€.
Prelude> 20 :: Int
20
Prelude> 20 :: Float
20.0
17. Type Class
Integral
μ΄ νμ
ν΄λμ€ μμ μ«μμ κ΄λ ¨λ νμ
ν΄λμ€μ
λλ€. λ¨ Numμ΄ λͺ¨λ μ«μλ₯Ό ν¬ν¨νλ λ°λ©΄
Integral νμ
ν΄λμ€μλ μ μμ κ΄λ ¨λ νμ
λ€λ§ μν©λλ€. μ΄ νμ
ν΄λμ€μ μν νμ
μΌλ‘λ Int,
Integerκ° μμ΅λλ€.
Floating
Floating νμ
ν΄λμ€ μμ μ«μμ κ΄λ ¨λ νμ
ν΄λμ€κ³ , μ΄λ¦μμλ μ μ μλ―μ΄ λΆλ μμμ κ΄λ ¨
νμ
λ€λ§ μν©λλ€. μ΄ νμ
ν΄λμ€μ μν νμ
μΌλ‘λ Float, Doubleμ΄ μμ΅λλ€.
18. Type Class
fromIntegral
μ«μ μ°μ°κ³Ό κ΄λ ¨νμ¬ μ μ©ν ν¨μλ‘ fromIntegralμ΄λΌλ ν¨μκ° μμ΅λλ€. μ΄ ν¨μμ νμ
μλͺ
μ
(Num b, Integral a) => a -> bλ‘, Integralμ ν΄λΉνλ νμ
μ Numμ ν΄λΉνλ νμ
μΌλ‘
λ°κΏμ£Όλ μν μ ν©λλ€. μ«μμΈλ° μλ‘ λ€λ₯Έ νμ
μΈ κ²½μ° κ°μ΄ κ³μ°ν λ μ μ©ν©λλ€. μλ₯Ό λ€μ΄ list
μ λ¦¬ν΄ νμ
μ IntμΈλ°, μ΄ κ°μ 3.2λΌλ λΆλ μμμ μ λνκ³ μΆλ€λ©΄ fromIntegral ν¨μλ₯Ό μ¨μΌ
ν©λλ€.
Prelude> fromIntegral (length [1,2,3,4]) + 3.2
7.2