SlideShare a Scribd company logo
Haskell
Study
3. type & typeclass
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)
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
Type
Haskell에 μžˆλŠ” λͺ‡ 가지 νƒ€μž…λ“€μ„ μ‚΄νŽ΄λ΄…μ‹œλ‹€.
β€’	 Int
μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λŒ€ν‘œμ μΈ νƒ€μž…μž…λ‹ˆλ‹€. -2147483648 ~ 2147483647 κΉŒμ§€ λ²”μœ„μ˜ μ •μˆ˜λ“€μ„
ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’	 Integer
μ—­μ‹œ μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μž…λ‹ˆλ‹€. 단, 이 νƒ€μž…μ€ 숫자 λ²”μœ„μ— ν•œκ³„κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ‹Ήμ—°ν•œ μ΄μ•ΌκΈ°μ§€λ§Œ Int
보닀 쑰금 느리긴 ν•©λ‹ˆλ‹€.
β€’	 Float
보톡 정밀도(single precision)의 뢀동 μ†Œμˆ˜μ  μˆ˜μž…λ‹ˆλ‹€.
Type
β€’	 Double
Single 보닀 더 μ •λ°€ν•œ(double precision) 뢀동 μ†Œμˆ˜μ  μˆ˜μž…λ‹ˆλ‹€.
β€’	 Bool
논리 νƒ€μž…μž…λ‹ˆλ‹€. True λ˜λŠ” FalseλΌλŠ” 두 개의 값을 가지고 μžˆμŠ΅λ‹ˆλ‹€.
β€’	 Char
문자λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν™‘λ”°μ˜΄ν‘œ(')둜 감싼 ν•˜λ‚˜μ˜ 문자의 ν˜•νƒœλ‘œ ν‘œκΈ°ν•©λ‹ˆλ‹€.
β€’	 Tuple
νŠœν”Œμ€ ꡬ성 μ›μ†Œμ— 따라 ꡉμž₯히 λ§Žμ€ μ’…λ₯˜μ˜ νƒ€μž…μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. ν•œ 가지 νŠΉμ§•μ μΈ 것은 빈 νŠœν”Œ ()
λ˜ν•œ νƒ€μž…μ΄λ©° 이 νƒ€μž…μ˜ 값은 () ν•˜λ‚˜ 밖에 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
Type variable
λ‹€λ₯Έ μ–Έμ–΄μ˜ μ œλ„€λ¦­μ΄λ‚˜ ν…œν”Œλ¦Ώκ³Ό λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ Haskellμ—λŠ” νƒ€μž… λ³€μˆ˜λΌλŠ” 것이 μžˆμŠ΅λ‹ˆλ‹€.
리슀트의 첫 번째 μ›μ†Œλ₯Ό κ°€μ Έμ˜€λŠ” head ν•¨μˆ˜μ˜ νƒ€μž…μ€ λ­˜κΉŒμš”?
Prelude> :t head
head :: [a] -> a
head의 νƒ€μž…μ€ [a] -> aμž…λ‹ˆλ‹€. head ν•¨μˆ˜λŠ” μž„μ˜ νƒ€μž…(a)의 리슀트([a])λ₯Ό 인자둜 λ°›μ•„ ν•΄λ‹Ή μž„μ˜
νƒ€μž…(a)의 κ°’ ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λΌλŠ” 의미죠. 이 λ•Œ head νƒ€μž… 선언에 λ‚˜νƒ€λ‚œ β€˜a’와 같이 μž„μ˜
νƒ€μž…μ— λŒ€μ‘λ  수 μžˆλŠ” 것을 β€˜νƒ€μž… λ³€μˆ˜β€™λΌκ³  ν•©λ‹ˆλ‹€. Haskell의 λͺ¨λ“  νƒ€μž…μ€ λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•˜λŠ” 반면
νƒ€μž… λ³€μˆ˜λŠ” νƒ€μž…μ΄ μ•„λ‹ˆλΌ νƒ€μž… β€˜λ³€μˆ˜β€™κΈ° λ•Œλ¬Έμ— μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•˜μ£ . κΌ­ ν•œ κΈ€μžμΌ ν•„μš”λŠ” μ—†μ§€λ§Œ 보톡
ν•œ κΈ€μžλ‘œ 많이 μ”λ‹ˆλ‹€.
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
Type Class
Haskellμ—λŠ” νƒ€μž… ν΄λž˜μŠ€λΌλŠ” κ°œλ…μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이름에 β€˜ν΄λž˜μŠ€β€™λΌλŠ” 말이 λ“€μ–΄κ°€ μžˆμ–΄μ„œ 쑰금 ν—·κ°ˆλ¦΄
수 μžˆμ§€λ§Œ, Haskell의 νƒ€μž… ν΄λž˜μŠ€λŠ” 타 μ–Έμ–΄μ˜ ν΄λž˜μŠ€μ™€λŠ” μ•„λ¬΄λŸ° 관련이 μ—†μŠ΅λ‹ˆλ‹€. 였히렀 λ”°μ§€μžλ©΄
μΈν„°νŽ˜μ΄μŠ€μ˜ κ°œλ…μ— 더 κ°€κΉμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œλ₯Ό μœ„ν•΄ == ν•¨μˆ˜μ˜ νƒ€μž…μ„ 확인해 λ΄…μ‹œλ‹€.
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
기호 => μ•žμ˜ 것은 클래슀 μ œμ•½(class constraint)이라고 λΆ€λ¦…λ‹ˆλ‹€. μ΄λŠ” νƒ€μž… λ³€μˆ˜ aκ°€ νƒ€μž…
클래슀 Eq에 μ†ν•˜λŠ” κ²½μš°μ—λ§Œ == ν•¨μˆ˜λ₯Ό μ“Έ 수 μžˆλ‹€λŠ” 뜻이죠. μ„œλ‘œ 같은지 λ‹€λ₯Έμ§€ 비ꡐ할 수 μžˆλŠ”
νƒ€μž…μ΄λΌλ©΄ νƒ€μž… 클래슀 Eq에 μ†ν•΄μ•Όν•©λ‹ˆλ‹€.
Type Class
Prelude> :t elem
elem :: Eq a => a -> [a] -> Bool
elemν•¨μˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ λ¦¬μŠ€νŠΈμ— μ†ν•˜λŠ” μ›μ†ŒμΈμ§€ μ•„λ‹Œμ§€λ₯Ό νŒλ³„ν•˜κΈ° μœ„ν•΄ == ν•¨μˆ˜λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.
κ·Έλž˜μ„œ elem ν•¨μˆ˜λŠ” Eq νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•œ νƒ€μž…μ—κ²Œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Haskellμ—λŠ” 기본적으둜 μ •μ˜λœ μ—¬λŸ¬ 가지 νƒ€μž… ν΄λž˜μŠ€λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. 각 νƒ€μž… ν΄λž˜μŠ€λ“€μ˜ νŠΉμ§•μ„
ν•˜λ‚˜μ”© μ‚΄νŽ΄λ΄…μ‹œλ‹€.
Type Class
Eq
μ„œλ‘œ 같은지 λ‹€λ₯Έμ§€ νŒλ³„ν•  수 μžˆλŠ” νƒ€μž…λ“€μ„ μœ„ν•΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 νƒ€μž… 클래슀의 멀버라면 == ν•¨μˆ˜μ™€
/= ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Ord
OrdλŠ” μˆœμ„œλ₯Ό 가진 νƒ€μž…λ“€μ„ μœ„ν•œ νƒ€μž… ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 이 νƒ€μž… ν΄λž˜μŠ€λŠ” >, <, >=, <= λ“±μ˜ ν•¨μˆ˜λ₯Ό
μ œκ³΅ν•©λ‹ˆλ‹€. 또 compare ν•¨μˆ˜(μ•žμ΄ 뒀보닀 크면 GT, κ°™μœΌλ©΄ EQ, μž‘μœΌλ©΄ LT λ°˜ν™˜)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
Ord νƒ€μž… 클래슀의 멀버가 되렀면 λ°˜λ“œμ‹œ Eq νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€.
Prelude> 5 `compare` 3
GT
Prelude> "abcd" < "efgh"
True
Type Class
Show
이 νƒ€μž… 클래슀의 λ©€λ²„λŠ” λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. show ν•¨μˆ˜λŠ” Show νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•˜λŠ”
νƒ€μž… κ°’ ν•˜λ‚˜λ₯Ό λ°›μ•„μ„œ κ·Έκ±Έ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄μ€λ‹ˆλ‹€.
Prelude> show 3
"3"
Prelude> show 5.334
"5.334"
Prelude> show True
"True"
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
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]
Type Class
Enum
Enum은 열거될 수 μžˆλŠ” νƒ€μž…λ“€μ„ μœ„ν•œ νƒ€μž… 클래슀 μž…λ‹ˆλ‹€. Enum νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•œ νƒ€μž…λ“€μ˜
경우 각각 μžμ‹ μ˜ 이전 κ°’κ³Ό λ‹€μŒ 값을 κ°€μ Έμ˜€λŠ” pred, succ ν•¨μˆ˜λ₯Ό μ“Έ 수 있으며 리슀트 λ²”μœ„(list
range)λ₯Ό μ΄μš©ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
Prelude> ['a'..'e']
"abcde"
Prelude> [LT..GT]
[LT, EQ, GT]
Prelude> succ 'B'
'C'
Type Class
Bounded
이 νƒ€μž… 클래슀의 멀버듀은 μƒν•œμ„ κ³Ό ν•˜ν•œμ„ μ„ κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.
Prelude> minBound :: Int
-2147483648
Prelude> maxBound :: Bool
True
Prelude> minBound :: Char
'NUL'
Type Class
Num
이 νƒ€μž… 클래슀의 멀버듀은 숫자처럼 λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Prelude> :t 20
20 :: Num a => a
숫자 λ¦¬ν„°λŸ΄μ€ κ·Έ 자체둜 λ‹€ν˜•μ μΈ νƒ€μž…μ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€. 숫자 λ¦¬ν„°λŸ΄μ€ Num νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•˜λŠ”
λͺ¨λ“  νƒ€μž…μ— λŒ€ν•΄ κ·Έ νƒ€μž…μ²˜λŸΌ λ™μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Prelude> 20 :: Int
20
Prelude> 20 :: Float
20.0
Type Class
Integral
이 νƒ€μž… 클래슀 μ—­μ‹œ μˆ«μžμ™€ κ΄€λ ¨λœ νƒ€μž… ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 단 Num이 λͺ¨λ“  숫자λ₯Ό ν¬ν•¨ν•˜λŠ” 반면
Integral νƒ€μž… ν΄λž˜μŠ€μ—λŠ” μ •μˆ˜μ™€ κ΄€λ ¨λœ νƒ€μž…λ“€λ§Œ μ†ν•©λ‹ˆλ‹€. 이 νƒ€μž…ν΄λž˜μŠ€μ— μ†ν•œ νƒ€μž…μœΌλ‘œλŠ” Int,
Integerκ°€ μžˆμŠ΅λ‹ˆλ‹€.
Floating
Floating νƒ€μž… 클래슀 μ—­μ‹œ μˆ«μžμ™€ κ΄€λ ¨λœ νƒ€μž… 클래슀고, μ΄λ¦„μ—μ„œλ„ μ•Œ 수 μžˆλ“―μ΄ 뢀동 μ†Œμˆ˜μ  κ΄€λ ¨
νƒ€μž…λ“€λ§Œ μ†ν•©λ‹ˆλ‹€. 이 νƒ€μž… ν΄λž˜μŠ€μ— μ†ν•œ νƒ€μž…μœΌλ‘œλŠ” Float, Double이 μžˆμŠ΅λ‹ˆλ‹€.
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

More Related Content

What's hot

Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
Nam Hyeonuk
Β 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
Nam Hyeonuk
Β 
Php functions
Php functionsPhp functions
Php functions
JIGAR MAKHIJA
Β 
Lesson 2 php data types
Lesson 2   php data typesLesson 2   php data types
Lesson 2 php data types
MLG College of Learning, Inc
Β 
SQL BUILT-IN FUNCTION
SQL BUILT-IN FUNCTIONSQL BUILT-IN FUNCTION
SQL BUILT-IN FUNCTION
Arun Sial
Β 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
Nam Hyeonuk
Β 
PHP file handling
PHP file handling PHP file handling
PHP file handling
wahidullah mudaser
Β 
Java arrays
Java arraysJava arrays
Java arraysJin Castor
Β 
Michael Bayer Introduction to SQLAlchemy @ Postgres Open
Michael Bayer Introduction to SQLAlchemy @ Postgres OpenMichael Bayer Introduction to SQLAlchemy @ Postgres Open
Michael Bayer Introduction to SQLAlchemy @ Postgres OpenPostgresOpen
Β 
SQL BASIC QUERIES SOLUTION ~hmftj
SQL BASIC QUERIES SOLUTION ~hmftjSQL BASIC QUERIES SOLUTION ~hmftj
On Parameterised Types and Java Generics
On Parameterised Types and Java GenericsOn Parameterised Types and Java Generics
On Parameterised Types and Java Generics
Yann-GaΓ«l GuΓ©hΓ©neuc
Β 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
Mahzad Zahedi
Β 
Applicative style programming
Applicative style programmingApplicative style programming
Applicative style programming
JosΓ© Luis GarcΓ­a HernΓ‘ndez
Β 
Java: Introduction to Arrays
Java: Introduction to ArraysJava: Introduction to Arrays
Java: Introduction to Arrays
Tareq Hasan
Β 
Racket perusteet 3. Funktio
Racket perusteet 3. FunktioRacket perusteet 3. Funktio
Racket perusteet 3. Funktio
Tiina Partanen
Β 
basic of desicion control statement in python
basic of  desicion control statement in pythonbasic of  desicion control statement in python
basic of desicion control statement in python
nitamhaske
Β 
MYSQL join
MYSQL joinMYSQL join
MYSQL join
Ahmed Farag
Β 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++
Lahiru Dilshan
Β 
pre processor directives in C
pre processor directives in Cpre processor directives in C
pre processor directives in CSahithi Naraparaju
Β 

What's hot (20)

Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
Β 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
Β 
Php functions
Php functionsPhp functions
Php functions
Β 
Lesson 2 php data types
Lesson 2   php data typesLesson 2   php data types
Lesson 2 php data types
Β 
SQL BUILT-IN FUNCTION
SQL BUILT-IN FUNCTIONSQL BUILT-IN FUNCTION
SQL BUILT-IN FUNCTION
Β 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
Β 
PHP file handling
PHP file handling PHP file handling
PHP file handling
Β 
Java arrays
Java arraysJava arrays
Java arrays
Β 
Michael Bayer Introduction to SQLAlchemy @ Postgres Open
Michael Bayer Introduction to SQLAlchemy @ Postgres OpenMichael Bayer Introduction to SQLAlchemy @ Postgres Open
Michael Bayer Introduction to SQLAlchemy @ Postgres Open
Β 
SQL BASIC QUERIES SOLUTION ~hmftj
SQL BASIC QUERIES SOLUTION ~hmftjSQL BASIC QUERIES SOLUTION ~hmftj
SQL BASIC QUERIES SOLUTION ~hmftj
Β 
On Parameterised Types and Java Generics
On Parameterised Types and Java GenericsOn Parameterised Types and Java Generics
On Parameterised Types and Java Generics
Β 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
Β 
Applicative style programming
Applicative style programmingApplicative style programming
Applicative style programming
Β 
Java: Introduction to Arrays
Java: Introduction to ArraysJava: Introduction to Arrays
Java: Introduction to Arrays
Β 
Racket perusteet 3. Funktio
Racket perusteet 3. FunktioRacket perusteet 3. Funktio
Racket perusteet 3. Funktio
Β 
basic of desicion control statement in python
basic of  desicion control statement in pythonbasic of  desicion control statement in python
basic of desicion control statement in python
Β 
Ref cursor
Ref cursorRef cursor
Ref cursor
Β 
MYSQL join
MYSQL joinMYSQL join
MYSQL join
Β 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++
Β 
pre processor directives in C
pre processor directives in Cpre processor directives in C
pre processor directives in C
Β 

Similar to Haskell study 3

[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1
μ§€ν™˜ κΉ€
Β 
Scala type args
Scala type argsScala type args
Scala type args
Yong Joon Moon
Β 
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
λͺ…μ„± μ •
Β 
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
Keunhyun Oh
Β 
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
Yong Joon Moon
Β 
Scala variable
Scala variableScala variable
Scala variable
Yong Joon Moon
Β 
Python
PythonPython
Python
Jinkyoung Kim
Β 

Similar to Haskell study 3 (7)

[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1
Β 
Scala type args
Scala type argsScala type args
Scala type args
Β 
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
λŸ¬λ‹μŠ€μΉΌλΌ - Scala 기초 (1)
Β 
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
[SwiftStudy 2016] 3μž₯. ν•¨μˆ˜
Β 
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
α„‘α…‘α„‹α…΅α„Šα…₯α†«α„Œα…₯α†Όα„…α…΅ 20160130
Β 
Scala variable
Scala variableScala variable
Scala variable
Β 
Python
PythonPython
Python
Β 

More from Nam Hyeonuk

Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œNext κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Nam Hyeonuk
Β 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
Nam Hyeonuk
Β 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
Nam Hyeonuk
Β 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
Nam Hyeonuk
Β 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
Nam Hyeonuk
Β 
Multi thread
Multi threadMulti thread
Multi thread
Nam Hyeonuk
Β 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
Nam Hyeonuk
Β 
Database
DatabaseDatabase
Database
Nam Hyeonuk
Β 
Exception&log
Exception&logException&log
Exception&log
Nam Hyeonuk
Β 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
Β 
Iocp κΈ°λ³Έ ꡬ쑰 이해
Iocp κΈ°λ³Έ ꡬ쑰 이해Iocp κΈ°λ³Έ ꡬ쑰 이해
Iocp κΈ°λ³Έ ꡬ쑰 이해
Nam Hyeonuk
Β 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
Nam Hyeonuk
Β 
Effective c++ chapter 1,2 μš”μ•½
Effective c++ chapter 1,2 μš”μ•½Effective c++ chapter 1,2 μš”μ•½
Effective c++ chapter 1,2 μš”μ•½
Nam Hyeonuk
Β 
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
Nam Hyeonuk
Β 
Gpg 1.1
Gpg 1.1Gpg 1.1
Gpg 1.1
Nam Hyeonuk
Β 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
Nam Hyeonuk
Β 
Age Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings PostmotemAge Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings Postmotem
Nam Hyeonuk
Β 

More from Nam Hyeonuk (17)

Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œNext κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Next κ²Œμž„ μ‹€μ „ ν”„λ‘œμ νŠΈ μŠ¬λΌμ΄λ“œ
Β 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
Β 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
Β 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
Β 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
Β 
Multi thread
Multi threadMulti thread
Multi thread
Β 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
Β 
Database
DatabaseDatabase
Database
Β 
Exception&log
Exception&logException&log
Exception&log
Β 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Β 
Iocp κΈ°λ³Έ ꡬ쑰 이해
Iocp κΈ°λ³Έ ꡬ쑰 이해Iocp κΈ°λ³Έ ꡬ쑰 이해
Iocp κΈ°λ³Έ ꡬ쑰 이해
Β 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
Β 
Effective c++ chapter 1,2 μš”μ•½
Effective c++ chapter 1,2 μš”μ•½Effective c++ chapter 1,2 μš”μ•½
Effective c++ chapter 1,2 μš”μ•½
Β 
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
ꡬ문과 의미둠(정적 μ˜λ―Έλ‘ κΉŒμ§€)
Β 
Gpg 1.1
Gpg 1.1Gpg 1.1
Gpg 1.1
Β 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
Β 
Age Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings PostmotemAge Of Empires II : Age Of Kings Postmotem
Age Of Empires II : Age Of Kings Postmotem
Β 

Haskell study 3

  • 2. 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