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

Haskell study 3

  • 1.
  • 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> :tfst 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> :telem 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