SlideShare a Scribd company logo
Haskell
Study
6. type & type class 2
Algebraic Data type
Haskell์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ๋Š” data ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€์—์„œ Bool ๋ฐ์ดํ„ฐ
ํƒ€์ž…์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
data Bool = False | True
data ๋‹ค์Œ ๋ถ€๋ถ„์ด ํƒ€์ž…์˜ ์ด๋ฆ„์ด๊ณ , = ์ดํ›„์˜ ๋ถ€๋ถ„์ด ํ•ด๋‹น ํƒ€์ž…์˜ ์ƒ์„ฑ์ž(๊ฐ’ ์ƒ์„ฑ์ž - value
constructor)๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. | (or)์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ data
๊ตฌ๋ฌธ์€ 'Bool ํƒ€์ž…์€ False ๋˜๋Š” True๋ผ๋Š” ๊ฐ’ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„๋‹ค' ๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…
์ด๋ฆ„, ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
Algebraic Data type
Haskell์—์„œ ์–ด๋–ค ๋„ํ˜•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›์€ ์ค‘์ ์˜ ์ขŒํ‘œ ๋ฐ
๋ฐ˜์ง€๋ฆ„, ์‚ฌ๊ฐํ˜•์€ ์ขŒ์ƒ๋‹จ๊ณผ ์šฐํ•˜๋‹จ์˜ ์ขŒํ‘œ ๋“ฑ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ๊ฑธ ํŠœํ”Œ์„ ์ด์šฉํ•ด ํ‘œํ˜„ํ• 
์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํŠœํ”Œ์€ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ฒŒ ์ข‹๊ฒ ์ฃ .
data Shape = Circle Float Float Float
			 | Rectangle Float Float Float Float
์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๊ฐ ๊ฐ’ ์ƒ์„ฑ์ž๋“ค์€ ํ•„๋“œ(Field)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Circle ๊ฐ’ ์ƒ์„ฑ์ž๋Š” Floatํ˜•์˜
๊ฐ’ 3๊ฐ€์ง€๋ฅผ ํ•„๋“œ๋กœ ๊ฐ–๊ฒŒ ๋˜๊ณ (์ฒซ ๋‘๊ฐœ๋Š” ์ค‘์ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ๋ฐ˜์ง€๋ฆ„), Rectangle ๊ฐ’ ์ƒ์„ฑ์ž๋Š” Float
ํ˜•์˜ ๊ฐ’ 4๊ฐ€์ง€๋ฅผ ํ•„๋“œ๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ (์ฒซ ๋‘๊ฐœ๋Š” ์ขŒ์ƒ๋‹จ, ๋‚˜๋จธ์ง€ ๋‘๊ฐœ๋Š” ์šฐํ•˜๋‹จ ์ขŒํ‘œ).
Algebraic Data type
๊ฐ’ ์ƒ์„ฑ์ž๋Š” ์‚ฌ์‹ค ํ•„๋“œ์˜ ๊ฐ’์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Prelude> :t Circle
Circle :: Float -> Float -> Float -> Shape
Prelude :t Rectangle
Rectangle :: Float -> Float -> Float -> Float -> Shape
๊ทธ๋ฆฌ๊ณ  ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์— ๋Œ€ํ•œ ํ•จ์ˆ˜์˜ ํŒจํ„ด ๋งค์นญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
surface :: Shape -> Float
surface (Circle _ _ r) = pi * r ^ 2
surface (Rectangle x1 y1 x2 y2) = abs $ (x2 - x1) * (y2 - y1)
Algebraic Data type
Bool ํƒ€์ž…์˜ ๊ฐ’ ์ƒ์„ฑ์ž True, False์ฒ˜๋Ÿผ ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„
์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์•ž์—์„œ ๋ดค๋“ฏ์ด ๊ฐ’ ์ƒ์„ฑ์ž ์—ญ์‹œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ง์ด ๋˜๊ณ , ๋”ฐ๋ผ์„œ ๋ถ€๋ถ„ ์ ์šฉ์˜
์ด์ ์„ ๊ฐ’ ์ƒ์„ฑ์ž์—๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
{-- ๋งจ ๋์— deriving Show๋ฅผ ๋ถ™์ด๋ฉด Show ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์†๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋‚˜์ค‘์—
๋‹ค๋ฃจ๋‹ˆ ์—ฌ๊ธฐ์„œ๋Š” ์ผ๋‹จ "๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฒฐ๊ณผ ์ฐฝ์— ๋„์šฐ๋ ค๋ฉด deriving Show๋ฅผ ์จ์ค˜์•ผ
ํ•œ๋‹ค" ์ •๋„๋กœ๋งŒ ์ดํ•ดํ•ด์ฃผ์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. --}
data Shape = Circle Float Float Float
			 | Rectangle Float Float Float Float deriving Show
Prelude> map (Circle 10 20) [4,5,6,6]
[Circle 10 20 4, Circle 10 20 5, Circle 10 20 6, Circle 10 20 6]
Record Syntax
์–ด๋–ค ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.
data Person = Person String String Int String deriving (Show)
์ฒซ ๋‘ ๊ฐœ๋Š” ๊ฐ๊ฐ ์ด๋ฆ„๊ณผ ์„ฑ, ์„ธ ๋ฒˆ์งธ๋Š” ๋‚˜์ด, ๋„ค ๋ฒˆ์งธ๋Š” ์ฃผ์†Œ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ์ด์ œ ์ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ
๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
firstname (Person firstname _ _ _) = firstname
lastname (Person _ lastname _ _) = lastname
age (Person _ _ age _) = age
address (Person _ _ _ address) = address
Record Syntax
์ฒ™ ๋ด๋„ ์•Œ๊ฒ ์ง€๋งŒ ์•ž์—์„œ์ฒ˜๋Ÿผ ๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ผ์ผํžˆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€
๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๊ณ  ๊ท€์ฐฎ์€ ์ผ์ž…๋‹ˆ๋‹ค. Haskell์—์„œ๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•ด Record Syntax๋ผ๋Š” ๋ฌธ๋ฒ•์„
์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
data Person = Person { firstname :: String
, lastname :: String
, age :: Int
, address :: String } deriving (Show)
Prelude> let nam = Person "nam" "hyeonuk" 21 "blahblah"
Prelude> age nam
21
Record Syntax
Record syntax๋Š” ์•ž์—์„œ์™€ ๊ฐ™์ด ๊ฐ’ ์ƒ์„ฑ์ž ๋’ค์— ์ค‘๊ด„ํ˜ธ ({}), ๊ทธ ๋‚ด๋ถ€์— ๊ฐ ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ํƒ€์ž…
์–ด๋…ธํ…Œ์ด์…˜(::)์„ ํ†ตํ•œ ํ•ด๋‹น ํ•„๋“œ์˜ ํƒ€์ž… ๋ช…์‹œ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. Record syntax๋กœ ์ƒ์„ฑ๋œ ํƒ€์ž…์€
๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Record syntax๋กœ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํ•ด๋‹น
ํƒ€์ž…์˜ ๊ฐ’ ์ƒ์„ฑ์ž๋กœ ๊ฐ’์„ ๋งŒ๋“ค ๋•Œ์—๋„ Record syntax ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์œผ๋กœ ์“ธ
๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•„๋“œ์˜ ์ˆœ์„œ๊ฐ€ ์„ ์–ธ ์ˆœ์„œ์™€ ์ผ์น˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
data Circle = Circle { origin :: (Int, Int)
, radius :: Int } deriving (Show)
Prelude> let c = Circle { radius = 5, origin = (0,0) }
Prelude> origin c
(0,0)
Type parameter
C++์˜ ํ…œํ”Œ๋ฆฟ๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ Haskell์—๋Š” ํƒ€์ž… ์ƒ์„ฑ์ž(Type constructor)๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ž… ์ƒ์„ฑ์ž๋Š” ํƒ€์ž…์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. ํ‘œ์ค€์— ์žˆ๋Š” ์œ ์šฉํ•œ ํƒ€์ž…
์ƒ์„ฑ์ž์ธ Maybe๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ด…์‹œ๋‹ค.
data Maybe a = Nothing | Just a
์—ฌ๊ธฐ์„œ a๊ฐ€ ๋ฐ”๋กœ ํƒ€์ž… ๋งค๊ฒจ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. Maybe ํƒ€์ž… ์ƒ์„ฑ์ž๋Š” Nothing ๊ฐ’ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ž„์˜์˜
ํƒ€์ž… a์— ๋Œ€ํ•ด ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ํ•˜๋‚˜ ํ•„๋“œ๋กœ ๋“ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด์ฃ . Maybe Int, Maybe
Char๊ฐ™์€ ๊ฒƒ๋“ค์ด ํ•˜๋‚˜์˜ ํƒ€์ž…์ด ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค. Maybe Int ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ Just 3, Just 22
๊ฐ™์€ ๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , Maybe Char ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ Just 'a', Just 'c'๊ฐ™์€ ๊ฐ’๋“ค์ด ์žˆ์„ ์ˆ˜
์žˆ๊ฒ ์ฃ .
Type parameter
์—ฌํƒœ๊ป ์จ์™”๋˜ ๋ฆฌ์ŠคํŠธ(list)์—ญ์‹œ ์ผ์ข…์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์—ฌํƒœ๊ป ์šฐ๋ฆฌ๋Š” ์ž„์˜์˜ ํƒ€์ž…์— ๋Œ€ํ•œ
๋ฆฌ์ŠคํŠธ๋ฅผ ์จ์™”์ฃ . ์‹ค์ œ๋กœ๋Š” ์ด ๋ฆฌ์ŠคํŠธ ์—ญ์‹œ ์ž„์˜์˜ ํƒ€์ž… a์— ๋Œ€ํ•ด [a] ํƒ€์ž…์„ ์ƒ์„ฑํ•˜๋Š” ํƒ€์ž… ์ƒ์„ฑ์ž๋ฅผ
๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‚ด๋ถ€์— ๋“ค๊ณ  ์žˆ๋Š” ํ•„๋“œ์˜ ๊ฐ’์ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ž‘ํ•  ํ•„์š”๊ฐ€
์žˆ์„ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.
Type synonyms
์–ด๋–ค ํƒ€์ž…์— ๋Œ€ํ•ด ๋ณ„๋ช…์„ ๋ถ™์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ type ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C์–ธ์–ด์˜ typedef,
C++ 11์˜ using ํ‚ค์›Œ๋“œ์™€ ๋™์ผํ•œ ์—ญํ• ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. type ํ‚ค์›Œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋Š”
์™„์ „ํžˆ ๋™์ผํ•˜๋‚˜ ์ด๋ฆ„๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค(์„œ๋กœ ํ˜ธํ™˜๋„ ๋ฉ๋‹ˆ๋‹ค). type ํ‚ค์›Œ๋“œ๋Š”
์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ String๊ณผ [Char]์„ ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.
type Point = (Int, Int)
distance :: Point -> Point -> Int
distance (x1,y1) (x2,y2) = sqrt $ (x2-x1)^2 + (y2-y1)^2
Derived instances
Haskell์˜ ๊ธฐ๋ณธ ํƒ€์ž…ํด๋ž˜์Šค๋“ค์€ deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ณ„๋„์˜ ์ •์˜ ์—†์ด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์˜
๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์— ์ •์˜๋œ ๋™์ž‘์„ ์ง€์›ํ•  ๋•Œ ํ•ด๋‹น
ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(instance)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์˜
๋™์ž‘์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•ž์—์„œ๋„ ๋ดค๋“ฏ์ด deriving Show ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€
์ž๋™์œผ๋กœ ํ•ด๋‹น ํƒ€์ž…์ด Show ํƒ€์ž… ํด๋ž˜์Šค์˜ ํ–‰๋™์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์ฃ . Show์™ธ์—๋„ Eq, Ord,
Enum, Bounded, Show, Read ๋“ฑ์— ๋Œ€ํ•ด deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
data Person = Person { firstname :: String
, lastname :: String
, age :: Int } deriving (Show, Eq)
Prelude> Person "nam" "hyeonuk" 21 == Person "nam" "hyeonuk" 21
True
Recursive Data
๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. list๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค.
data List a = Empty
| Cons a (List a) deriving (Show, Read, Eq, Ord)
Prelude> 5 `Cons` Empty
Cons 5 Empty
Prelude> 4 `Cons` 5 `Cons` Empty
Cons 4 (Cons 5 Empty)
์œ„์˜ List ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ Empty(๋นˆ ๋ฆฌ์ŠคํŠธ [])์™€ Cons(:)๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Cons ์ƒ์„ฑ์ž๋Š” ๋‹ค์‹œ ์ž์‹ ์˜ ํ•„๋“œ๋กœ List a๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๊ฐ€ ๋˜๋Š” ๊ฑฐ์ฃ . ์ด ์žฌ๊ท€์ 
๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์œ„์™€ ๊ฐ™์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Recursive Data
๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŠธ๋ฆฌ ์—ญ์‹œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
data Tree a = EmptyTree
| Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
์œ„ ํŠธ๋ฆฌ๊ตฌ์กฐ์— ์‚ฝ์ž… / ์‚ญ์ œ ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ์›ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ž์‹ ์˜ ํ•„์š”์— ๋งž๊ฒŒ ๊ฐ„๋‹จํ•œ Binary
Search Tree ๋“ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
typeclass
์ด๋ฒˆ์—” ์ง์ ‘ ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์šฐ์„  ์˜ˆ์ œ๋กœ ํ‘œ์ค€์— ์žˆ๋Š” Eq ํƒ€์ž… ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ
๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๋จผ์ € ์‚ดํŽด๋ณด์ฃ .
class Eq a where
	(==) :: a -> a -> Bool
	(/=) :: a -> a -> Bool
	 x == y = not (x /= y)
	 x /= y = not (x == y)
์ƒˆ๋กœ์šด ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. class ๋’ค์— ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ
ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…์„ ์ง€์นญํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ทธ๋ฆฌ๊ณ  where ์ดํ›„์— ํ•ด๋‹น ํƒ€์ž…
ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…๋“ค์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ๋งŒ ํ•˜๋Š” ๋™์ž‘๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
typeclass
class Eq a where
	(==) :: a -> a -> Bool
	(/=) :: a -> a -> Bool
	 x == y = not (x /= y)
	 x /= y = not (x == y)
ํƒ€์ž… ํด๋ž˜์Šค ์ •์˜์˜ ๋งจ ์•„๋ž˜์ชฝ์„ ๋ณด๋ฉด x == y์™€ x /= y๊ฐ€ ์„œ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ
์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฌ๊ท€์  ์ •์˜์— ์˜ํ•ด == ๋˜๋Š” /= ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๋ฉด ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋„ ๊ทธ ์ •์˜์—
์˜ํ•ด ์ž๋™์œผ๋กœ ์ •์˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— Eq ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…์ด ==๊ณผ /= ๋™์ž‘์„ ์–ด๋–ป๊ฒŒ
์ˆ˜ํ–‰ํ•ด์•ผํ•  ์ง€ ์ •์˜ํ•  ๋•Œ ๋‘˜ ๋ชจ๋‘๋ฅผ ์ •์˜ํ•  ํ•„์š” ์—†์ด, ์ •์˜ํ•˜๊ธฐ ํŽธํ•œ ๊ฒƒ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๋ฉด ๋˜๋Š”
ํŽธ์˜์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์ฃ .
typeclass
์ด์ œ ํŠน์ • ํƒ€์ž…์ด ์–ด๋–ค ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„
์‚ดํŽด๋ด…์‹œ๋‹ค.
data TrafficLight = Red | Yellow | Green
์‹ ํ˜ธ๋“ฑ ์ƒ‰๊น”์„ ๋‚˜ํƒ€๋‚ธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์ด Eq ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด
ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
instance Eq TrafficLight where
	Red == Red = True
	Green == Green = True
	Yellow == Yellow = True
	 _ == _ = False
typeclass
instance Eq TrafficLight where
	Red == Red = True
	Green == Green = True
	Yellow == Yellow = True
	 _ == _ = False
ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด instance ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›๋ž˜
ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ a๋กœ ํ‘œํ˜„ํ–ˆ๋˜ ๋ถ€๋ถ„์— ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ํƒ€์ž…์„ ์ ์–ด์ฃผ๊ณ , where
๋’ค์— ์ •์˜ํ•ด์•ผํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ๋™์ž‘์„ ์ •์˜ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ TrafficLight์— ๋Œ€ํ•œ == ํ•จ์ˆ˜๋งŒ์„
์ •์˜ํ•ด์ฃผ์—ˆ๊ณ , /= ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์  ์ •์˜ ( not ( x == y ) )์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ •์˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
typeclass
์–ด๋–ค ํƒ€์ž… ํด๋ž˜์Šค์˜ sub typeclass๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Ord ํƒ€์ž… ํด๋ž˜์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด
์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
class (Eq a) => Ord a where
	compare :: a -> a -> Ording
	... -- ์ž์„ธํ•œ ๊ตฌํ˜„์€ ์ƒ๋žต
์œ„์™€ ๊ฐ™์ด ์ด์ „์— ํƒ€์ž… ํด๋ž˜์Šค ์ œ์•ฝ์กฐ๊ฑด์„ ํ‘œ๊ธฐํ•  ๋•Œ ์ผ๋˜ =>์„ ์ด์šฉํ•ด sub typeclass๋ฅผ ๋งŒ๋“ค ์ˆ˜
์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์„ ์–ธ์˜ ์˜๋ฏธ๋Š” Ord ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ Eq ํƒ€์ž… ํด๋ž˜์Šค์— ๋จผ์ €
์†ํ•ด์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ œ์•ฝ์€ ํƒ€์ž… ํด๋ž˜์Šค์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํƒ€์ž… ํด๋ž˜์Šค์˜
๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
typeclass
class (Eq m) => Eq (Maybe m) where
	 Just x == Just y = x == y
	Nothing == Nothing = True
	 _ == _ = False
Maybe ํƒ€์ž…์˜ Eq ํƒ€์ž… ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ •์˜์ž…๋‹ˆ๋‹ค. ๋‘ Just ๊ฐ’ ๋น„๊ต๋Š” ๊ทธ ๋‚ด๋ถ€ ๊ฐ’์ด ๊ฐ™์€ ์ง€
์•„๋‹Œ์ง€๋กœ ํŒ๋ณ„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋•Œ == ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ ค๋ฉด Maybe์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ญ์‹œ Eq ํƒ€์ž… ํด๋ž˜์Šค์—
์†ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Eq m ์ด๋ผ๋Š” ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ์–ด Just x ์™€ Just y ์˜ ๋น„๊ต์— x == y๋ฅผ ์‚ฌ์šฉํ• 
์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์—ฐ์Šต ๋ฌธ์ œ
โ€ข	binary search tree
BST๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…๊ณผ, ํŠธ๋ฆฌ์— ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ํ•จ์ˆ˜, ์–ด๋–ค
์›์†Œ๊ฐ€ ํ•ด๋‹น ํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜ ๋“ฑ์„ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. BST๋Š” ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ž์‹ ์˜ ์™ผ์ชฝ
์ž์‹์€ ๋ชจ๋‘ ์ž์‹ ๋ณด๋‹ค ๊ฐ’์ด ์ž‘์•„์•ผํ•˜๋ฉฐ, ์ž์‹ ์˜ ์˜ค๋ฅธ์ชฝ์ž์‹์€ ๋ชจ๋‘ ์ž์‹ ๋ณด๋‹ค ๊ฐ’์ด ํฐ ํŠธ๋ฆฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์€ ์œ ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค(์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
์ถ”๊ฐ€์ ์œผ๋กœ ์ข€ ๋” ์—ฐ์Šต์„ ํ•ด๋ณด๊ณ  ์‹ถ์œผ์‹  ๋ถ„์€ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜, ํ˜น์€ Red-Black Tree๋‚˜ AVL
Tree๊ฐ™์ด ๊ท ํ˜•์žก์ธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
Nam Hyeonuk
ย 
The Sieve of Eratosthenes - Part 1
The Sieve of Eratosthenes - Part 1The Sieve of Eratosthenes - Part 1
The Sieve of Eratosthenes - Part 1
Philip Schwarz
ย 
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
Philip Schwarz
ย 
Applicative Functor
Applicative FunctorApplicative Functor
Applicative Functor
Philip Schwarz
ย 
JavaScript: Variables and Functions
JavaScript: Variables and FunctionsJavaScript: Variables and Functions
JavaScript: Variables and FunctionsJussi Pohjolainen
ย 
Left and Right Folds - Comparison of a mathematical definition and a programm...
Left and Right Folds- Comparison of a mathematical definition and a programm...Left and Right Folds- Comparison of a mathematical definition and a programm...
Left and Right Folds - Comparison of a mathematical definition and a programm...
Philip Schwarz
ย 
Nat, List and Option Monoids - from scratch - Combining and Folding - an example
Nat, List and Option Monoids -from scratch -Combining and Folding -an exampleNat, List and Option Monoids -from scratch -Combining and Folding -an example
Nat, List and Option Monoids - from scratch - Combining and Folding - an example
Philip Schwarz
ย 
The Uniform Access Principle
The Uniform Access PrincipleThe Uniform Access Principle
The Uniform Access Principle
Philip Schwarz
ย 
php basics
php basicsphp basics
php basics
Anmol Paul
ย 
Sequence and Traverse - Part 2
Sequence and Traverse - Part 2Sequence and Traverse - Part 2
Sequence and Traverse - Part 2
Philip Schwarz
ย 
Punteros
PunterosPunteros
Punteros
lguerrerj
ย 
polymorphism
polymorphism polymorphism
polymorphism
Imtiaz Hussain
ย 
9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript
pcnmtutorials
ย 
Css pseudo-classes
Css pseudo-classesCss pseudo-classes
Css pseudo-classes
Webtech Learning
ย 
Javascript this keyword
Javascript this keywordJavascript this keyword
Javascript this keyword
Pham Huy Tung
ย 
Arrays and structures
Arrays and structuresArrays and structures
Arrays and structuresMohd Arif
ย 
Monad Laws Must be Checked
Monad Laws Must be CheckedMonad Laws Must be Checked
Monad Laws Must be Checked
Philip Schwarz
ย 
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค Part one
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค   Part one์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค   Part one
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค Part oneJi Hun Kim
ย 

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
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
ย 
The Sieve of Eratosthenes - Part 1
The Sieve of Eratosthenes - Part 1The Sieve of Eratosthenes - Part 1
The Sieve of Eratosthenes - Part 1
ย 
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
The Sieve of Eratosthenes - Part II - Genuine versus Unfaithful Sieve - Haske...
ย 
Applicative Functor
Applicative FunctorApplicative Functor
Applicative Functor
ย 
JavaScript: Variables and Functions
JavaScript: Variables and FunctionsJavaScript: Variables and Functions
JavaScript: Variables and Functions
ย 
Left and Right Folds - Comparison of a mathematical definition and a programm...
Left and Right Folds- Comparison of a mathematical definition and a programm...Left and Right Folds- Comparison of a mathematical definition and a programm...
Left and Right Folds - Comparison of a mathematical definition and a programm...
ย 
Nat, List and Option Monoids - from scratch - Combining and Folding - an example
Nat, List and Option Monoids -from scratch -Combining and Folding -an exampleNat, List and Option Monoids -from scratch -Combining and Folding -an example
Nat, List and Option Monoids - from scratch - Combining and Folding - an example
ย 
The Uniform Access Principle
The Uniform Access PrincipleThe Uniform Access Principle
The Uniform Access Principle
ย 
php basics
php basicsphp basics
php basics
ย 
Sequence and Traverse - Part 2
Sequence and Traverse - Part 2Sequence and Traverse - Part 2
Sequence and Traverse - Part 2
ย 
Punteros
PunterosPunteros
Punteros
ย 
polymorphism
polymorphism polymorphism
polymorphism
ย 
9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript
ย 
Css pseudo-classes
Css pseudo-classesCss pseudo-classes
Css pseudo-classes
ย 
Javascript this keyword
Javascript this keywordJavascript this keyword
Javascript this keyword
ย 
Arrays and structures
Arrays and structuresArrays and structures
Arrays and structures
ย 
Monad Laws Must be Checked
Monad Laws Must be CheckedMonad Laws Must be Checked
Monad Laws Must be Checked
ย 
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค Part one
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค   Part one์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค   Part one
์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค Part one
ย 

Similar to Haskell study 6

STL study (skyLab)
STL study (skyLab)STL study (skyLab)
STL study (skyLab)
Gyeongwook Choi
ย 
๊ฐ•์˜์ž๋ฃŒ3
๊ฐ•์˜์ž๋ฃŒ3๊ฐ•์˜์ž๋ฃŒ3
๊ฐ•์˜์ž๋ฃŒ3Young Wook Kim
ย 
Scala type class pattern
Scala type class patternScala type class pattern
Scala type class pattern
Yong Joon Moon
ย 
Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008daliot
ย 
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
Devgear
ย 
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
quxn6
ย 
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
Yong Joon Moon
ย 
Data Structure 4
Data Structure 4Data Structure 4
Data Structure 4yonsei
ย 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
Chris Ohk
ย 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)
์Šน์šฑ ์ •
ย 
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌJavascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
ETRIBE_STG
ย 
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
Jong Gook Bae
ย 
2014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #62014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #6
Chris Ohk
ย 
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
Yong Joon Moon
ย 
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
Park JoongSoo
ย 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
ย 
Scala
ScalaScala
ScalaJaejin Yun
ย 
UML Diagram about Class / Activity / Object (Korean Language)
UML Diagram about Class / Activity / Object (Korean Language)UML Diagram about Class / Activity / Object (Korean Language)
UML Diagram about Class / Activity / Object (Korean Language)
Prof. Chung
ย 
Start IoT with JavaScript - 4.๊ฐ์ฒด1
Start IoT with JavaScript - 4.๊ฐ์ฒด1Start IoT with JavaScript - 4.๊ฐ์ฒด1
Start IoT with JavaScript - 4.๊ฐ์ฒด1
Park Jonggun
ย 
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉํ•ด๊ฐ•
ย 

Similar to Haskell study 6 (20)

STL study (skyLab)
STL study (skyLab)STL study (skyLab)
STL study (skyLab)
ย 
๊ฐ•์˜์ž๋ฃŒ3
๊ฐ•์˜์ž๋ฃŒ3๊ฐ•์˜์ž๋ฃŒ3
๊ฐ•์˜์ž๋ฃŒ3
ย 
Scala type class pattern
Scala type class patternScala type class pattern
Scala type class pattern
ย 
Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008
ย 
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
๋ธํŒŒ์ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ์•„ํ‚คํ…์ฒ˜
ย 
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
์ดํŽ™ํ‹ฐ๋ธŒ C++ ์Šคํ„ฐ๋””
ย 
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซแ„Œแ…ฅแ†ผแ„…แ…ต 20160130
ย 
Data Structure 4
Data Structure 4Data Structure 4
Data Structure 4
ย 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
ย 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)
ย 
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌJavascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
Javascript ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ •๋ฆฌ
ย 
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์Šค์นผ๋ผ
ย 
2014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #62014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #6
ย 
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
แ„‘แ…กแ„‹แ…ตแ„Šแ…ฅแ†ซ+แ„Œแ…ฎแ„‹แ…ญ+แ„‹แ…ญแ†ผแ„‹แ…ฅ+แ„Œแ…ฅแ†ผแ„…แ…ต 20160304
ย 
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
์ผ๋‹จ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ
ย 
Programming java day2
Programming java day2Programming java day2
Programming java day2
ย 
Scala
ScalaScala
Scala
ย 
UML Diagram about Class / Activity / Object (Korean Language)
UML Diagram about Class / Activity / Object (Korean Language)UML Diagram about Class / Activity / Object (Korean Language)
UML Diagram about Class / Activity / Object (Korean Language)
ย 
Start IoT with JavaScript - 4.๊ฐ์ฒด1
Start IoT with JavaScript - 4.๊ฐ์ฒด1Start IoT with JavaScript - 4.๊ฐ์ฒด1
Start IoT with JavaScript - 4.๊ฐ์ฒด1
ย 
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 11์žฅ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
ย 

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 6

  • 1. Haskell Study 6. type & type class 2
  • 2. Algebraic Data type Haskell์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ๋Š” data ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€์—์„œ Bool ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. data Bool = False | True data ๋‹ค์Œ ๋ถ€๋ถ„์ด ํƒ€์ž…์˜ ์ด๋ฆ„์ด๊ณ , = ์ดํ›„์˜ ๋ถ€๋ถ„์ด ํ•ด๋‹น ํƒ€์ž…์˜ ์ƒ์„ฑ์ž(๊ฐ’ ์ƒ์„ฑ์ž - value constructor)๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. | (or)์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ data ๊ตฌ๋ฌธ์€ 'Bool ํƒ€์ž…์€ False ๋˜๋Š” True๋ผ๋Š” ๊ฐ’ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„๋‹ค' ๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์ด๋ฆ„, ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • 3. Algebraic Data type Haskell์—์„œ ์–ด๋–ค ๋„ํ˜•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›์€ ์ค‘์ ์˜ ์ขŒํ‘œ ๋ฐ ๋ฐ˜์ง€๋ฆ„, ์‚ฌ๊ฐํ˜•์€ ์ขŒ์ƒ๋‹จ๊ณผ ์šฐํ•˜๋‹จ์˜ ์ขŒํ‘œ ๋“ฑ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ๊ฑธ ํŠœํ”Œ์„ ์ด์šฉํ•ด ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํŠœํ”Œ์€ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ฒŒ ์ข‹๊ฒ ์ฃ . data Shape = Circle Float Float Float | Rectangle Float Float Float Float ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ๊ฐ ๊ฐ’ ์ƒ์„ฑ์ž๋“ค์€ ํ•„๋“œ(Field)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Circle ๊ฐ’ ์ƒ์„ฑ์ž๋Š” Floatํ˜•์˜ ๊ฐ’ 3๊ฐ€์ง€๋ฅผ ํ•„๋“œ๋กœ ๊ฐ–๊ฒŒ ๋˜๊ณ (์ฒซ ๋‘๊ฐœ๋Š” ์ค‘์ , ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ๋ฐ˜์ง€๋ฆ„), Rectangle ๊ฐ’ ์ƒ์„ฑ์ž๋Š” Float ํ˜•์˜ ๊ฐ’ 4๊ฐ€์ง€๋ฅผ ํ•„๋“œ๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ (์ฒซ ๋‘๊ฐœ๋Š” ์ขŒ์ƒ๋‹จ, ๋‚˜๋จธ์ง€ ๋‘๊ฐœ๋Š” ์šฐํ•˜๋‹จ ์ขŒํ‘œ).
  • 4. Algebraic Data type ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ์‚ฌ์‹ค ํ•„๋“œ์˜ ๊ฐ’์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Prelude> :t Circle Circle :: Float -> Float -> Float -> Shape Prelude :t Rectangle Rectangle :: Float -> Float -> Float -> Float -> Shape ๊ทธ๋ฆฌ๊ณ  ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์— ๋Œ€ํ•œ ํ•จ์ˆ˜์˜ ํŒจํ„ด ๋งค์นญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. surface :: Shape -> Float surface (Circle _ _ r) = pi * r ^ 2 surface (Rectangle x1 y1 x2 y2) = abs $ (x2 - x1) * (y2 - y1)
  • 5. Algebraic Data type Bool ํƒ€์ž…์˜ ๊ฐ’ ์ƒ์„ฑ์ž True, False์ฒ˜๋Ÿผ ๊ฐ’ ์ƒ์„ฑ์ž๋Š” ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์•ž์—์„œ ๋ดค๋“ฏ์ด ๊ฐ’ ์ƒ์„ฑ์ž ์—ญ์‹œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ง์ด ๋˜๊ณ , ๋”ฐ๋ผ์„œ ๋ถ€๋ถ„ ์ ์šฉ์˜ ์ด์ ์„ ๊ฐ’ ์ƒ์„ฑ์ž์—๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. {-- ๋งจ ๋์— deriving Show๋ฅผ ๋ถ™์ด๋ฉด Show ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์†๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋‚˜์ค‘์— ๋‹ค๋ฃจ๋‹ˆ ์—ฌ๊ธฐ์„œ๋Š” ์ผ๋‹จ "๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฒฐ๊ณผ ์ฐฝ์— ๋„์šฐ๋ ค๋ฉด deriving Show๋ฅผ ์จ์ค˜์•ผ ํ•œ๋‹ค" ์ •๋„๋กœ๋งŒ ์ดํ•ดํ•ด์ฃผ์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. --} data Shape = Circle Float Float Float | Rectangle Float Float Float Float deriving Show Prelude> map (Circle 10 20) [4,5,6,6] [Circle 10 20 4, Circle 10 20 5, Circle 10 20 6, Circle 10 20 6]
  • 6. Record Syntax ์–ด๋–ค ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒ€์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. data Person = Person String String Int String deriving (Show) ์ฒซ ๋‘ ๊ฐœ๋Š” ๊ฐ๊ฐ ์ด๋ฆ„๊ณผ ์„ฑ, ์„ธ ๋ฒˆ์งธ๋Š” ๋‚˜์ด, ๋„ค ๋ฒˆ์งธ๋Š” ์ฃผ์†Œ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ์ด์ œ ์ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. firstname (Person firstname _ _ _) = firstname lastname (Person _ lastname _ _) = lastname age (Person _ _ age _) = age address (Person _ _ _ address) = address
  • 7. Record Syntax ์ฒ™ ๋ด๋„ ์•Œ๊ฒ ์ง€๋งŒ ์•ž์—์„œ์ฒ˜๋Ÿผ ๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ผ์ผํžˆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๊ณ  ๊ท€์ฐฎ์€ ์ผ์ž…๋‹ˆ๋‹ค. Haskell์—์„œ๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์œ„ํ•ด Record Syntax๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. data Person = Person { firstname :: String , lastname :: String , age :: Int , address :: String } deriving (Show) Prelude> let nam = Person "nam" "hyeonuk" 21 "blahblah" Prelude> age nam 21
  • 8. Record Syntax Record syntax๋Š” ์•ž์—์„œ์™€ ๊ฐ™์ด ๊ฐ’ ์ƒ์„ฑ์ž ๋’ค์— ์ค‘๊ด„ํ˜ธ ({}), ๊ทธ ๋‚ด๋ถ€์— ๊ฐ ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜(::)์„ ํ†ตํ•œ ํ•ด๋‹น ํ•„๋“œ์˜ ํƒ€์ž… ๋ช…์‹œ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. Record syntax๋กœ ์ƒ์„ฑ๋œ ํƒ€์ž…์€ ๊ฐ ํ•„๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Record syntax๋กœ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’ ์ƒ์„ฑ์ž๋กœ ๊ฐ’์„ ๋งŒ๋“ค ๋•Œ์—๋„ Record syntax ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์œผ๋กœ ์“ธ ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•„๋“œ์˜ ์ˆœ์„œ๊ฐ€ ์„ ์–ธ ์ˆœ์„œ์™€ ์ผ์น˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. data Circle = Circle { origin :: (Int, Int) , radius :: Int } deriving (Show) Prelude> let c = Circle { radius = 5, origin = (0,0) } Prelude> origin c (0,0)
  • 9. Type parameter C++์˜ ํ…œํ”Œ๋ฆฟ๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ Haskell์—๋Š” ํƒ€์ž… ์ƒ์„ฑ์ž(Type constructor)๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์ƒ์„ฑ์ž๋Š” ํƒ€์ž…์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. ํ‘œ์ค€์— ์žˆ๋Š” ์œ ์šฉํ•œ ํƒ€์ž… ์ƒ์„ฑ์ž์ธ Maybe๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ด…์‹œ๋‹ค. data Maybe a = Nothing | Just a ์—ฌ๊ธฐ์„œ a๊ฐ€ ๋ฐ”๋กœ ํƒ€์ž… ๋งค๊ฒจ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. Maybe ํƒ€์ž… ์ƒ์„ฑ์ž๋Š” Nothing ๊ฐ’ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ž„์˜์˜ ํƒ€์ž… a์— ๋Œ€ํ•ด ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ํ•˜๋‚˜ ํ•„๋“œ๋กœ ๋“ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด์ฃ . Maybe Int, Maybe Char๊ฐ™์€ ๊ฒƒ๋“ค์ด ํ•˜๋‚˜์˜ ํƒ€์ž…์ด ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค. Maybe Int ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ Just 3, Just 22 ๊ฐ™์€ ๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , Maybe Char ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ Just 'a', Just 'c'๊ฐ™์€ ๊ฐ’๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ .
  • 10. Type parameter ์—ฌํƒœ๊ป ์จ์™”๋˜ ๋ฆฌ์ŠคํŠธ(list)์—ญ์‹œ ์ผ์ข…์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์—ฌํƒœ๊ป ์šฐ๋ฆฌ๋Š” ์ž„์˜์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์จ์™”์ฃ . ์‹ค์ œ๋กœ๋Š” ์ด ๋ฆฌ์ŠคํŠธ ์—ญ์‹œ ์ž„์˜์˜ ํƒ€์ž… a์— ๋Œ€ํ•ด [a] ํƒ€์ž…์„ ์ƒ์„ฑํ•˜๋Š” ํƒ€์ž… ์ƒ์„ฑ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‚ด๋ถ€์— ๋“ค๊ณ  ์žˆ๋Š” ํ•„๋“œ์˜ ๊ฐ’์ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ž‘ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.
  • 11. Type synonyms ์–ด๋–ค ํƒ€์ž…์— ๋Œ€ํ•ด ๋ณ„๋ช…์„ ๋ถ™์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ type ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C์–ธ์–ด์˜ typedef, C++ 11์˜ using ํ‚ค์›Œ๋“œ์™€ ๋™์ผํ•œ ์—ญํ• ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. type ํ‚ค์›Œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์™„์ „ํžˆ ๋™์ผํ•˜๋‚˜ ์ด๋ฆ„๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค(์„œ๋กœ ํ˜ธํ™˜๋„ ๋ฉ๋‹ˆ๋‹ค). type ํ‚ค์›Œ๋“œ๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ String๊ณผ [Char]์„ ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. type Point = (Int, Int) distance :: Point -> Point -> Int distance (x1,y1) (x2,y2) = sqrt $ (x2-x1)^2 + (y2-y1)^2
  • 12. Derived instances Haskell์˜ ๊ธฐ๋ณธ ํƒ€์ž…ํด๋ž˜์Šค๋“ค์€ deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ณ„๋„์˜ ์ •์˜ ์—†์ด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์— ์ •์˜๋œ ๋™์ž‘์„ ์ง€์›ํ•  ๋•Œ ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(instance)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์˜ ๋™์ž‘์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•ž์—์„œ๋„ ๋ดค๋“ฏ์ด deriving Show ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ํƒ€์ž…์ด Show ํƒ€์ž… ํด๋ž˜์Šค์˜ ํ–‰๋™์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์ฃ . Show์™ธ์—๋„ Eq, Ord, Enum, Bounded, Show, Read ๋“ฑ์— ๋Œ€ํ•ด deriving ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. data Person = Person { firstname :: String , lastname :: String , age :: Int } deriving (Show, Eq) Prelude> Person "nam" "hyeonuk" 21 == Person "nam" "hyeonuk" 21 True
  • 13. Recursive Data ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. list๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord) Prelude> 5 `Cons` Empty Cons 5 Empty Prelude> 4 `Cons` 5 `Cons` Empty Cons 4 (Cons 5 Empty) ์œ„์˜ List ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ Empty(๋นˆ ๋ฆฌ์ŠคํŠธ [])์™€ Cons(:)๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Cons ์ƒ์„ฑ์ž๋Š” ๋‹ค์‹œ ์ž์‹ ์˜ ํ•„๋“œ๋กœ List a๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๊ฐ€ ๋˜๋Š” ๊ฑฐ์ฃ . ์ด ์žฌ๊ท€์  ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ์œ„์™€ ๊ฐ™์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 14. Recursive Data ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŠธ๋ฆฌ ์—ญ์‹œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Read, Eq) ์œ„ ํŠธ๋ฆฌ๊ตฌ์กฐ์— ์‚ฝ์ž… / ์‚ญ์ œ ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ์›ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ž์‹ ์˜ ํ•„์š”์— ๋งž๊ฒŒ ๊ฐ„๋‹จํ•œ Binary Search Tree ๋“ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 15. typeclass ์ด๋ฒˆ์—” ์ง์ ‘ ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์šฐ์„  ์˜ˆ์ œ๋กœ ํ‘œ์ค€์— ์žˆ๋Š” Eq ํƒ€์ž… ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”์ง€ ๋จผ์ € ์‚ดํŽด๋ณด์ฃ . class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) ์ƒˆ๋กœ์šด ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. class ๋’ค์— ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…์„ ์ง€์นญํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ทธ๋ฆฌ๊ณ  where ์ดํ›„์— ํ•ด๋‹น ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…๋“ค์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ๋งŒ ํ•˜๋Š” ๋™์ž‘๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • 16. typeclass class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) ํƒ€์ž… ํด๋ž˜์Šค ์ •์˜์˜ ๋งจ ์•„๋ž˜์ชฝ์„ ๋ณด๋ฉด x == y์™€ x /= y๊ฐ€ ์„œ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฌ๊ท€์  ์ •์˜์— ์˜ํ•ด == ๋˜๋Š” /= ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๋ฉด ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋„ ๊ทธ ์ •์˜์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ •์˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— Eq ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๋Š” ํƒ€์ž…์ด ==๊ณผ /= ๋™์ž‘์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ์ง€ ์ •์˜ํ•  ๋•Œ ๋‘˜ ๋ชจ๋‘๋ฅผ ์ •์˜ํ•  ํ•„์š” ์—†์ด, ์ •์˜ํ•˜๊ธฐ ํŽธํ•œ ๊ฒƒ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•˜๋ฉด ๋˜๋Š” ํŽธ์˜์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์ฃ .
  • 17. typeclass ์ด์ œ ํŠน์ • ํƒ€์ž…์ด ์–ด๋–ค ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด…์‹œ๋‹ค. data TrafficLight = Red | Yellow | Green ์‹ ํ˜ธ๋“ฑ ์ƒ‰๊น”์„ ๋‚˜ํƒ€๋‚ธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์ด Eq ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. instance Eq TrafficLight where Red == Red = True Green == Green = True Yellow == Yellow = True _ == _ = False
  • 18. typeclass instance Eq TrafficLight where Red == Red = True Green == Green = True Yellow == Yellow = True _ == _ = False ํƒ€์ž… ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด instance ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›๋ž˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ a๋กœ ํ‘œํ˜„ํ–ˆ๋˜ ๋ถ€๋ถ„์— ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ํƒ€์ž…์„ ์ ์–ด์ฃผ๊ณ , where ๋’ค์— ์ •์˜ํ•ด์•ผํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ๋™์ž‘์„ ์ •์˜ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ TrafficLight์— ๋Œ€ํ•œ == ํ•จ์ˆ˜๋งŒ์„ ์ •์˜ํ•ด์ฃผ์—ˆ๊ณ , /= ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์  ์ •์˜ ( not ( x == y ) )์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ •์˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • 19. typeclass ์–ด๋–ค ํƒ€์ž… ํด๋ž˜์Šค์˜ sub typeclass๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Ord ํƒ€์ž… ํด๋ž˜์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. class (Eq a) => Ord a where compare :: a -> a -> Ording ... -- ์ž์„ธํ•œ ๊ตฌํ˜„์€ ์ƒ๋žต ์œ„์™€ ๊ฐ™์ด ์ด์ „์— ํƒ€์ž… ํด๋ž˜์Šค ์ œ์•ฝ์กฐ๊ฑด์„ ํ‘œ๊ธฐํ•  ๋•Œ ์ผ๋˜ =>์„ ์ด์šฉํ•ด sub typeclass๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์„ ์–ธ์˜ ์˜๋ฏธ๋Š” Ord ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ Eq ํƒ€์ž… ํด๋ž˜์Šค์— ๋จผ์ € ์†ํ•ด์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ œ์•ฝ์€ ํƒ€์ž… ํด๋ž˜์Šค์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํƒ€์ž… ํด๋ž˜์Šค์˜ ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 20. typeclass class (Eq m) => Eq (Maybe m) where Just x == Just y = x == y Nothing == Nothing = True _ == _ = False Maybe ํƒ€์ž…์˜ Eq ํƒ€์ž… ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ •์˜์ž…๋‹ˆ๋‹ค. ๋‘ Just ๊ฐ’ ๋น„๊ต๋Š” ๊ทธ ๋‚ด๋ถ€ ๊ฐ’์ด ๊ฐ™์€ ์ง€ ์•„๋‹Œ์ง€๋กœ ํŒ๋ณ„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋•Œ == ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ ค๋ฉด Maybe์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ญ์‹œ Eq ํƒ€์ž… ํด๋ž˜์Šค์— ์†ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Eq m ์ด๋ผ๋Š” ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ์–ด Just x ์™€ Just y ์˜ ๋น„๊ต์— x == y๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • 21. ์—ฐ์Šต ๋ฌธ์ œ โ€ข binary search tree BST๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…๊ณผ, ํŠธ๋ฆฌ์— ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ํ•จ์ˆ˜, ์–ด๋–ค ์›์†Œ๊ฐ€ ํ•ด๋‹น ํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜ ๋“ฑ์„ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. BST๋Š” ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ž์‹ ์˜ ์™ผ์ชฝ ์ž์‹์€ ๋ชจ๋‘ ์ž์‹ ๋ณด๋‹ค ๊ฐ’์ด ์ž‘์•„์•ผํ•˜๋ฉฐ, ์ž์‹ ์˜ ์˜ค๋ฅธ์ชฝ์ž์‹์€ ๋ชจ๋‘ ์ž์‹ ๋ณด๋‹ค ๊ฐ’์ด ํฐ ํŠธ๋ฆฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์€ ์œ ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค(์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์ถ”๊ฐ€์ ์œผ๋กœ ์ข€ ๋” ์—ฐ์Šต์„ ํ•ด๋ณด๊ณ  ์‹ถ์œผ์‹  ๋ถ„์€ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜, ํ˜น์€ Red-Black Tree๋‚˜ AVL Tree๊ฐ™์ด ๊ท ํ˜•์žก์ธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.