Haskell
Study
2. list & tuple
List - ํ‘œ๊ธฐ
list๋Š” Haskell์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. List๋Š” ๋™์ผํ•œ ํƒ€์ž…์˜ ์ž๋ฃŒ๋ฅผ ๋‹ด๋Š”
์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ, ํƒ€ ์–ธ์–ด์—์„œ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list)์™€ ๋™์ผํ•œ ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ 
์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ๋Œ€๊ด„ํ˜ธ([]) ๋ฐ ์ฝค๋งˆ(,)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ghci๋ฅผ ์ผœ์„œ
ํ™•์ธํ•ด๋ด…์‹œ๋‹ค. ghci์—์„œ ์ด๋ฆ„(ํ•จ์ˆ˜)์„ ์ •์˜ํ•˜๋ ค๋ฉด let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ghci์—์„œ let a = 3
์ด๋ผ๊ณ  ์“ฐ๋Š” ๊ฑด ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ a =3 ์ด๋ผ๊ณ  ์“ฐ๊ณ  ghci์—์„œ ๊ทธ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
Prelude> let numbers = [1,3,5,10,12]
Prelude> numbers
[1,3,5,10,12]
Prelude> let evens = [2,4,6,8,10,12]
Prelude> evens
[2,4,6,8,10,12]
List - ํ‘œ๊ธฐ
Haskell์—์„œ ๋ฌธ์ž์—ด์€ ๋ฌธ์ž๋“ค์˜ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฌธ์ž๋Š” ํ™‘๋”ฐ์˜ดํ‘œ(โ€˜) ์‚ฌ์ด์˜ ๋ฌธ์ž๋กœ
ํ‘œํ˜„๋˜๋ฉฐ ๋ฌธ์ž์—ด์€ ์Œ๋”ฐ์˜ดํ‘œ(โ€œ)์‚ฌ์ด์˜ ๋ฌธ์ž๋“ค๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. [โ€˜1โ€™,โ€™2โ€™,โ€™3โ€™]๊ณผ โ€œ123โ€์€ ๊ฐ™์€
ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.
Prelude> [โ€˜1โ€™,โ€™2โ€™,โ€™3โ€™]
โ€œ123โ€
Prelude> โ€œ123โ€
โ€œ123โ€
List - ํ‘œ๊ธฐ
๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ์น  ๋•Œ๋Š” ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€
์ด ์—ฐ์‚ฐ์ž์˜ ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Haskell์˜ list๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ linked list์ฒ˜๋Ÿผ
๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์‚ฐ์ž์˜ ์ขŒ์ธก์— ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์ˆœํšŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋ฆฌ์ŠคํŠธ์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋กœ : (cons) ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š”
๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์›์†Œ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
Prelude> โ€œ1234โ€ ++ โ€œ5678โ€
โ€œ12345678โ€
Prelude> 0:[1,2,3]
[0,1,2,3]
* ์ฐธ๊ณ ) ๋ฆฌ์ŠคํŠธ [0,1,2,3]์€ 0:1:2:3:[]๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
List - ํ‘œ๊ธฐ
๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ™์€ ๊ฒƒ๋„ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ์›์†Œ๋งŒ ๋‹ด์„ ์ˆ˜
์žˆ์œผ๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ™์€ ๊ฒฝ์šฐ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๋“ค์˜ ํƒ€์ž…์ด ์„œ๋กœ ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๋Š” ๋‹ฌ๋ผ๋„
์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.
Prelude> [ [1,2,3] , [1,2] , [5,6,7] ]
[[1,2,3],[1,2],[5,6,7]]
Prelude> [ โ€œappleโ€, โ€œbananaโ€ ]
[โ€œappleโ€, โ€œbananaโ€ ]
Prelude> [ [1,2,3], โ€œappleโ€ ]
<interactive>:4:3:
	 No instance for <Num Char> arising from the literal โ€˜1โ€™
	 In the expression : 1
	 In the expression : [1,2,3]
	 In the expression : [[1, 2, 3], โ€œappleโ€]
์„œ๋กœ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ
๋ฆฌ์ŠคํŠธ์— ๋„ฃ์„ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ์—๋Ÿฌ
๋ฉ”์‹œ์ง€๊ฐ€ ๋œน๋‹ˆ๋‹ค
List - ๋น„๊ต
๊ฐ™์€ ํƒ€์ž…์˜ ๋‘ ๋ฆฌ์ŠคํŠธ๋Š” ์„œ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ ํƒ€์ž…์ด ์„œ๋กœ ๋น„๊ต๋  ์ˆ˜ ์žˆ๋Š”
ํƒ€์ž…์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๋น„๊ต์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ผ๋ฆฌ ๋น„๊ตํ•ด์„œ ํฐ
์ชฝ์ด ๋” ํฌ๊ณ , ์ฒซ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ๋‘๋ฒˆ์งธ ์›์†Œ๋ผ๋ฆฌ ๋น„๊ตํ•ด์„œ ํฐ ์ชฝ์ด ๋” ํฌ๊ณ , ... ํ•˜๋Š” ์‹์ด์ฃ .
Prelude> [1,2,3] > [4,5,6]
False
Prelude> [1,2,3] > [1,2]
True
Prelude> [3,4,2] > [2,4]
True
Prelude> [3,4,2] == [3,4,2]
True
List - ์—ฐ์‚ฐ
๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์›์†Œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ ์˜ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” !! ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Prelude> [1,2,3,4] !! 2
3
head๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ, tail์€ ๋งจ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ
๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
Prelude> head [1,2,3,4]
1
Prelude> tail [1,2,3,4]
[2,3,4]
List - ์—ฐ์‚ฐ
last ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ, init ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜
๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
Prelude> last [1,2,3,4]
4
Prelude> init [1,2,3,4]
[1,2,3]
์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜์‹œ๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค.
[1,2,3,4,5,6,7,8,9,10]
head tail
lastinit
List - ์—ฐ์‚ฐ
length๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
Prelude> length [1,2,3,4]
4
null์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ…… ๋น„์—ˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. list == [] ์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ ๋ณด๋‹ค๋Š” ์ด
ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š” ํŽธ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค.
Prelude> null [1,2,3,4]
False
Prelude> null []
True
List - ์—ฐ์‚ฐ
reverse๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘์–ด์ค๋‹ˆ๋‹ค.
Prelude> reverse [1,2,3,4]
[4,3,2,1]
take๋Š” ์ˆซ์ž์™€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐœ์ˆ˜๋งŒํผ์˜ ์›์†Œ๋กœ ์ด๋ฃจ์–ด์ง„
๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Prelude> take 3 [1,2,3,4]
[1,2,3]
Prelude> take 5 [1,2,3,4]
[1,2,3,4]
List - ์—ฐ์‚ฐ
drop์€ ๋ฐ˜๋Œ€๋กœ ์ฃผ์–ด์ง„ ๊ฐœ์ˆ˜๋งŒํผ์˜ ์›์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
Prelude> drop 3 [1,2,3,4]
[4]
Prelude> drop 5 [1,2,3,4]
[]
maximum / minimum์€ ๊ฐ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Prelude> maximum [1,2,3,4]
4
Prelude> minimum [1,2,3,4]
1
List - ์—ฐ์‚ฐ
sum / product๋Š” ๊ฐ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋“ค ๋ชจ๋‘๋ฅผ ๋”ํ•œ ๊ฐ’๊ณผ ๋ชจ๋‘๋ฅผ ๊ณฑํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Prelude> sum [1,2,3,4]
10
Prelude> product [1,2,3,4]
24
elem์€ ์›์†Œ ํ•˜๋‚˜์™€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ์›์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•ด์ค๋‹ˆ๋‹ค.
Prelude> โ€˜aโ€™ `elem` โ€œabcdโ€
True
Prelude> 3 `elem` [1,2,4,5]
False
List - ๋ฒ”์œ„
Haskell์—๋Š” ํŠน์ • ๋ฒ”์œ„์— ์žˆ๋Š” ๊ฐ’๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฌธ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฒ”์œ„(range) ๋ฆฌ์ŠคํŠธ๋Š” ํŠน์ • ๋ฒ”์œ„์— ์žˆ๋Š” ๋“ฑ์ฐจ ์ˆ˜์—ด์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.
Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
๊ธฐ๋ณธ์ ์œผ๋กœ [(์‹œ์ž‘๊ฐ’)..(์ข…๋ฃŒ๊ฐ’)] ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ์‹œ์ž‘๊ฐ’์—์„œ ๊ฐ’์„
ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ์ข…๋ฃŒ๊ฐ’๊นŒ์ง€์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
Prelude> [โ€˜aโ€™..โ€™zโ€™]
โ€œabcdefghijklmnopqrstuvwxyzโ€
Prelude> [โ€˜Aโ€™..โ€™Fโ€™]
โ€œABCDEFโ€
List - ๋ฒ”์œ„
๊ฐ’์˜ ์ฆ๊ฐ€ ์ •๋„๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ ์›์†Œ์™€ ๋‘๋ฒˆ์งธ ์›์†Œ๊นŒ์ง€ ํ‘œ๊ธฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ
๋‘ ์›์†Œ์˜ ์ฐจ์ด๋งŒํผ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์˜ ์›์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
Prelude> [1,4..10]
[1,4,7,10]
Prelude> [โ€˜aโ€™,โ€™cโ€™..โ€™zโ€™]
โ€œacegikmoqsuwyโ€
Prelude> [0.1, 0.3 .. 1]
[0.1,0.3,0.5,0.7,0.899999999999,1.0999999999999]
๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ๊ฒฝ์šฐ ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ถ€์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ๋ฒ•์—์„œ๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์ ์€
๋˜๋„๋ก ์•ˆ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
List - ๋ฒ”์œ„:๋ฌดํ•œ
Haskell์€ ์ง€์—ฐ ๊ณ„์‚ฐ์ด๋ผ๋Š” ํŠน์ง•์„ ์ด์šฉํ•ด์„œ ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์˜
๋ฒ”์œ„ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ƒ๋žตํ•˜๋ฉด ๊ณง ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง์ˆ˜๋“ค์˜
๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
Prelude> let evens = [2,4..]
์ด์ œ evens๋Š” ์ง์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ evens๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ๊นŒ์ง€๋Š” ์ง€์—ฐ ๊ณ„์‚ฐ์˜
ํŠน์„ฑ๋•Œ๋ฌธ์— ํ•ด๋‹น ์‹์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ฒ˜์Œ๋ถ€ํ„ฐ 10๊ฐœ์˜ ์ง์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€๋ด…์‹œ๋‹ค.
Prelude> take 10 evens
[2,4,6,8,10,12,14,16,18,20]
๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ๋Œ€ ๋ฆฌ์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.
List - ๋ฒ”์œ„:๋ฌดํ•œ
cycle ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ทธ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.
Prelude> take 10 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1]
Prelude> take 12 (cycle โ€œEE! โ€œ)
โ€œEE! EE! EE! โ€œ
repeat๋Š” ์›์†Œ๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ๊ทธ ์›์†Œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Prelude> take 5 (repeat 3)
[3,3,3,3,3]
take n (repeat k)๋Š” replicate n k์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ๋ณดํ†ต replicate 5 3๊ณผ ๊ฐ™์ด ์”๋‹ˆ๋‹ค.
List Comprehension
list comprehension์€ list๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ๋ฒ•์€
์ˆ˜ํ•™์—์„œ ์ง‘ํ•ฉ์„ ํ‘œ๊ธฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์ œ์‹œ๋ฒ•๊ณผ ์•„์ฃผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ 10๊ฐœ์˜ ์ง์ˆ˜๋ฅผ
๋‚˜ํƒ€๋‚ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ list comprehension์„ ์ด์šฉํ•ด ํ‘œ๊ธฐํ•ด๋ด…์‹œ๋‹ค.
Prelude> [x*2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
list comprehension์—์„œ ํŒŒ์ดํ”„(|) ์™ผ์ชฝ์€ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋“ค์–ด๊ฐˆ ์›์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ํŒŒ์ดํ”„
์˜ค๋ฅธ์ชฝ์€ ๊ทธ ์›์†Œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ๊ฑด๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ x <- [1..10]์„ ํ†ตํ•ด x
๋Š” ๋ฆฌ์ŠคํŠธ [1..10] ์†์— ์†ํ•˜๋Š” ์›์†Œ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ทธ ๊ฐ๊ฐ์˜ x์— ๋Œ€ํ•ด 2๋ฅผ ๊ณฑํ•œ ๊ฐ’์ด ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์—
ํฌํ•จ๋œ๋‹ค๊ณ  ํ‘œ๊ธฐํ–ˆ์œผ๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ ์ฒซ 10๊ฐœ์˜ ์ง์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
List Comprehension
๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋” ์‚ดํŽด๋ด…์‹œ๋‹ค. ์šฐ์„ , ์ฒซ 10๊ฐœ์˜ ์ง์ˆ˜ ์ค‘์—์„œ ํฌ๊ธฐ๊ฐ€ 10์ด์ƒ์ธ ์ง์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ
list comprehension์„ ํ†ตํ•ด ๊ตฌํ•ด๋ด…์‹œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํŒŒ์ดํ”„(|) ์˜ค๋ฅธ์ชฝ์— ์กฐ๊ฑด(์ˆ ์–ด)๋ฅผ ๋”ํ•ด์ค„ ์ˆ˜
์žˆ์Šต๋‹ˆ๋‹ค.
Prelude> [x*2 | x <- [1..10], x*2 >= 10]
[10,12,14,16,18,20]
1๋ถ€ํ„ฐ 20 ์‚ฌ์ด์˜ ์ˆซ์ž์ค‘ 3 ๋˜๋Š” 5์˜ ๋ฐฐ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
Prelude> [x | x <- [1..20], x `mod` 3 == 0 || x `mod` 5 == 0]
[3,5,6,9,10,12,15,18,20]
List Comprehension
list comprehension์—์„œ ์ˆ ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ค„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์›์†Œ๋ฅผ
๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, [1,2,3]๊ณผ [4,5,6]์˜ ๋ชจ๋“  ์›์†Œ๋“ค์˜ ๊ณฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์›์†Œ๋ฅผ
๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค.
Prelude> [x*y | x <- [1,2,3], y <- [4,5,6] ]
[4,5,6,8,10,12,12,15,18]
Prelude> [x*y | x <- [1,2,3], y <- [4,5,6], x*y > 10]
[12,12,15,18]
์ด๊ฑด ๋งˆ์น˜ ๋ช…๋ นํ˜• ์–ธ์–ด์—์„œ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. [1,2,3]์—์„œ ์›์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๊ณ , ๊ทธ
์›์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด y์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ๋Œ€์‘์‹œํ‚ค๋ฉด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ด…๋‹ˆ๋‹ค.
List Comprehension
list comprehension ์—ญ์‹œ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด list์˜ list์—์„œ ๋‚ด๋ถ€์˜ list๋“ค์—
๋Œ€ํ•ด ์ง์ˆ˜์ธ ์›์†Œ๋“ค์€ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค.
first.hs
removeOdd xxs = [ [ x | x <- xs, odd x] | xs <- xxs]
ghci
Prelude> :l first.hs
Prelude> removeOdd [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]]
[[1,3],[5,7],[],[1,3,5,7]]
list comprehension์€ ์ค‘์ฒฉํ•ด์„œ ์“ธ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋• ์—ฌ๋Ÿฌ ์ค„์— ๋‚˜๋ˆ ์„œ
์“ฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฑธ ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
์—ฐ์Šต ๋ฌธ์ œ
โ€ข	lastButOne
list๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์—์„œ ํ•œ ์นธ ์•ž ์›์†Œ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด
lastButOne [1,2,3,4]๋Š” 3์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ€ข	notCapital
๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ๋ฌธ์ž์—ด์—์„œ ๋Œ€๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด notCapital โ€œHaHaHa, NotCapitalโ€ ์€ โ€œaaa, otapitalโ€์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ€ข	diff
๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ a,b๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ a์˜ ์›์†Œ ์ค‘ b์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์›์†Œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”
ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด diff [1,2,3,4,5,6] [3,5,7] ์€ [1,2,4,6]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
tuple
tuple์€ list์™€ ๋น„์Šทํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๋‹ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. tuple์ด list์™€ ์ฐจ์ด ๋‚˜๋Š” ๋‘ ๊ฐ€์ง€๋Š”,
tuple์€ ์›์†Œ ๊ฐœ์ˆ˜๊ฐ€ ๊ณ ์ •์ด๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’๋„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. tuple์€ ์†Œ๊ด„ํ˜ธ์™€
์ฝค๋งˆ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์€ ์ˆ˜ํ•™์—์„œ ๋ฒกํ„ฐ ๋“ฑ์„ ํ‘œ๊ธฐํ•˜๋Š”๋ฐ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠœํ”Œ์˜ ํ•œ ๊ฐ€์ง€ ํŠน์ง•์€ ์›์†Œ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Prelude> [(1,2), (1,2,3)]
<interactive>:2:9:
	 Couldnโ€™t match expected type โ€˜(t, t3)โ€™
				 with actual type โ€˜(t0, t1, t2)โ€™
	 Relevant bindings include
		 it :: [(t, t3)] (bound at <interactive>:2:1)
	 In the expression: (1,2,3)
	 In the expression: [(1,2), (1,2,3)]
	 In an equation for โ€˜itโ€™ : it = [(1,2), (1,2,3)]
์ด๋ ‡๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ
ํƒ€์ž…์„ ํ•œ ๋ฆฌ์ŠคํŠธ์—
๋‹ด์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ
๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
tuple
ํŠœํ”Œ์€ ์ˆ˜ํ•™์—์„œ์˜ 2์ฐจ์›, 3์ฐจ์› ๋ฒกํ„ฐ ๋“ฑ์„ ํ‘œ๊ธฐํ•  ๋•Œ๋‚˜, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ฌถ์–ด์„œ
๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ 2์ธ ํŠœํ”Œ์„ ํŽ˜์–ด(pair), 3์ธ
ํŠœํ”Œ์„ ํŠธ๋ฆฌํ”Œ(triple)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํŽ˜์–ด์˜ ๊ฒฝ์šฐ fst์™€ snd ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
Prelude> fst (1,4)
1
Prelude> snd (1,4)
4
fst์™€ snd ํ•จ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2์ธ ํŠœํ”Œ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 3-tuple, 4-tuple, ... ๋“ฑ์— ๋Œ€ํ•ด์„œ๋Š”
๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ํŠœํ”Œ์— ๋Œ€ํ•ด ๊ฐ ์›์†Œ๋“ค์„ ๋ฝ‘์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์— ๋‹ค๋ค„๋ด…์‹œ๋‹ค.
tuple
pair๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” zip์ด๋ผ๋Š” ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜
๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ง ์ง€์€ ํŽ˜์–ด๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Prelude> zip [โ€˜oneโ€™, โ€˜twoโ€™, โ€˜threeโ€™] [1,2,3]
[(โ€˜oneโ€™,1), (โ€˜twoโ€™,2), (โ€˜threeโ€™,3)]
Prelude> zip [1..] โ€œabcdโ€
[(1,โ€™aโ€™), (2,โ€™bโ€™), (3,โ€™cโ€™), (4,โ€™dโ€™)]
zip์€ ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ฑฐ๋‚˜ ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋™์‹œ์— ์ˆœํšŒํ•ด์•ผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜
์žˆ์Šต๋‹ˆ๋‹ค. zip์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๊ธธ์ด๊ฐ€ ์งง์€ ์ชฝ์˜ ๋ฆฌ์ŠคํŠธ์— ๋งž์ถฐ์„œ
์ž˜๋ฆฝ๋‹ˆ๋‹ค.
ํ™œ์šฉ
tuple๊ณผ list๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด…์‹œ๋‹ค.
โ€œ์„ธ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ๋ชจ๋‘ 10์ดํ•˜์˜ ์ •์ˆ˜์ธ ์‚ผ๊ฐํ˜• ์ค‘์—์„œ, ๋‘˜๋ ˆ๊ฐ€ 24์ธ ์ง๊ฐ ์‚ผ๊ฐํ˜•์—๋Š” ์–ด๋–ค ๊ฒƒ์ด
์žˆ๋Š”๊ฐ€?โ€
์ด ๋ฌธ์ œ๋Š” list comprehension๊ณผ tuple์„ ์ด์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  list
comprehension์„ ์ด์šฉํ•ด ์„ธ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ๋ชจ๋‘ 10์ดํ•˜์ธ ์‚ผ๊ฐํ˜• ๋ชฉ๋ก์„ ๊ตฌํ•ด๋ด…์‹œ๋‹ค.
[(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10]]
ํ™œ์šฉ
์—ฌ๊ธฐ์„œ ์ง๊ฐ ์‚ผ๊ฐํ˜•์˜ ๊ฒฝ์šฐ ๋น—๋ณ€ ๊ธธ์ด์˜ ์ œ๊ณฑ์€ ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€์˜ ๊ธธ์ด์˜ ์ œ๊ณฑ์˜ ํ•ฉ๊ณผ ๊ฐ™์œผ๋ฉฐ,
์ง๊ฐ์‚ผ๊ฐํ˜•์˜ ๊ฐ ๋ณ€์€ ๋น—๋ณ€์˜ ๊ธธ์ด๋ณด๋‹ค ๊ธธ ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด์„ ๋ฐ˜์˜ํ•ด๋ด…์‹œ๋‹ค.
[(a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b],
a^2 + b^2 == c^2]
์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์กฐ๊ฑด์€ ๋‘˜๋ ˆ๊ฐ€ 24๋ผ๋Š” ์กฐ๊ฑด ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด ํ•˜๋‚˜๊นŒ์ง€ ๋ฐ˜์˜ํ•ด์„œ
๋‹ต์„ ๊ตฌํ•ด ๋ด…์‹œ๋‹ค.
Prelude> [(a,b,c)| c <- [1..10], b <- [1..c], a <- [1..b],
a^2 + b^2 == c^2, a+b+c==24]
[(6,8,10)]
์—ฐ์Šต ๋ฌธ์ œ
โ€ข	swap
ํŽ˜์–ด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด
swap [(1,2), (3,4), (5,6), (7,8)]์€ [(2,1), (4,3), (6,5), (8,7)]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ€ข	sum
๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์ด๋ฏธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—
์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜๋‹ˆ sum ์™ธ์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด sumโ€™ [1,2,3,4,5] ๋Š” 15๋ฅผ
๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ€ข	divisors
์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ›์•„ ๊ทธ ์ˆซ์ž์˜ ๋ชจ๋“  ์•ฝ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด
divisors 20 ์€ [1,2,4,5,10,20]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Haskell study 2

  • 1.
  • 2.
    List - ํ‘œ๊ธฐ list๋Š”Haskell์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. List๋Š” ๋™์ผํ•œ ํƒ€์ž…์˜ ์ž๋ฃŒ๋ฅผ ๋‹ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ, ํƒ€ ์–ธ์–ด์—์„œ์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list)์™€ ๋™์ผํ•œ ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ๋Œ€๊ด„ํ˜ธ([]) ๋ฐ ์ฝค๋งˆ(,)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ghci๋ฅผ ์ผœ์„œ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค. ghci์—์„œ ์ด๋ฆ„(ํ•จ์ˆ˜)์„ ์ •์˜ํ•˜๋ ค๋ฉด let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ghci์—์„œ let a = 3 ์ด๋ผ๊ณ  ์“ฐ๋Š” ๊ฑด ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ a =3 ์ด๋ผ๊ณ  ์“ฐ๊ณ  ghci์—์„œ ๊ทธ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Prelude> let numbers = [1,3,5,10,12] Prelude> numbers [1,3,5,10,12] Prelude> let evens = [2,4,6,8,10,12] Prelude> evens [2,4,6,8,10,12]
  • 3.
    List - ํ‘œ๊ธฐ Haskell์—์„œ๋ฌธ์ž์—ด์€ ๋ฌธ์ž๋“ค์˜ ๋ฆฌ์ŠคํŠธ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฌธ์ž๋Š” ํ™‘๋”ฐ์˜ดํ‘œ(โ€˜) ์‚ฌ์ด์˜ ๋ฌธ์ž๋กœ ํ‘œํ˜„๋˜๋ฉฐ ๋ฌธ์ž์—ด์€ ์Œ๋”ฐ์˜ดํ‘œ(โ€œ)์‚ฌ์ด์˜ ๋ฌธ์ž๋“ค๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. [โ€˜1โ€™,โ€™2โ€™,โ€™3โ€™]๊ณผ โ€œ123โ€์€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. Prelude> [โ€˜1โ€™,โ€™2โ€™,โ€™3โ€™] โ€œ123โ€ Prelude> โ€œ123โ€ โ€œ123โ€
  • 4.
    List - ํ‘œ๊ธฐ ๋‘๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ์น  ๋•Œ๋Š” ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ ์ด ์—ฐ์‚ฐ์ž์˜ ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋А๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Haskell์˜ list๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ linked list์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ++ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์‚ฐ์ž์˜ ์ขŒ์ธก์— ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์ˆœํšŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋กœ : (cons) ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์›์†Œ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Prelude> โ€œ1234โ€ ++ โ€œ5678โ€ โ€œ12345678โ€ Prelude> 0:[1,2,3] [0,1,2,3] * ์ฐธ๊ณ ) ๋ฆฌ์ŠคํŠธ [0,1,2,3]์€ 0:1:2:3:[]๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • 5.
    List - ํ‘œ๊ธฐ ๋ฆฌ์ŠคํŠธ์˜๋ฆฌ์ŠคํŠธ๊ฐ™์€ ๊ฒƒ๋„ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ์›์†Œ๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ™์€ ๊ฒฝ์šฐ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๋“ค์˜ ํƒ€์ž…์ด ์„œ๋กœ ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๋Š” ๋‹ฌ๋ผ๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. Prelude> [ [1,2,3] , [1,2] , [5,6,7] ] [[1,2,3],[1,2],[5,6,7]] Prelude> [ โ€œappleโ€, โ€œbananaโ€ ] [โ€œappleโ€, โ€œbananaโ€ ] Prelude> [ [1,2,3], โ€œappleโ€ ] <interactive>:4:3: No instance for <Num Char> arising from the literal โ€˜1โ€™ In the expression : 1 In the expression : [1,2,3] In the expression : [[1, 2, 3], โ€œappleโ€] ์„œ๋กœ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์„ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œน๋‹ˆ๋‹ค
  • 6.
    List - ๋น„๊ต ๊ฐ™์€ํƒ€์ž…์˜ ๋‘ ๋ฆฌ์ŠคํŠธ๋Š” ์„œ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ ํƒ€์ž…์ด ์„œ๋กœ ๋น„๊ต๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๋น„๊ต์˜ ๊ฒฝ์šฐ ์‚ฌ์ „์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ผ๋ฆฌ ๋น„๊ตํ•ด์„œ ํฐ ์ชฝ์ด ๋” ํฌ๊ณ , ์ฒซ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ๋‘๋ฒˆ์งธ ์›์†Œ๋ผ๋ฆฌ ๋น„๊ตํ•ด์„œ ํฐ ์ชฝ์ด ๋” ํฌ๊ณ , ... ํ•˜๋Š” ์‹์ด์ฃ . Prelude> [1,2,3] > [4,5,6] False Prelude> [1,2,3] > [1,2] True Prelude> [3,4,2] > [2,4] True Prelude> [3,4,2] == [3,4,2] True
  • 7.
    List - ์—ฐ์‚ฐ ๋ฆฌ์ŠคํŠธ์—์„œํŠน์ • ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์›์†Œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ ์˜ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” !! ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Prelude> [1,2,3,4] !! 2 3 head๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ, tail์€ ๋งจ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Prelude> head [1,2,3,4] 1 Prelude> tail [1,2,3,4] [2,3,4]
  • 8.
    List - ์—ฐ์‚ฐ lastํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ, init ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Prelude> last [1,2,3,4] 4 Prelude> init [1,2,3,4] [1,2,3] ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜์‹œ๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค. [1,2,3,4,5,6,7,8,9,10] head tail lastinit
  • 9.
    List - ์—ฐ์‚ฐ length๋Š”๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. Prelude> length [1,2,3,4] 4 null์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ…… ๋น„์—ˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. list == [] ์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ ๋ณด๋‹ค๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š” ํŽธ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค. Prelude> null [1,2,3,4] False Prelude> null [] True
  • 10.
    List - ์—ฐ์‚ฐ reverse๋Š”๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘์–ด์ค๋‹ˆ๋‹ค. Prelude> reverse [1,2,3,4] [4,3,2,1] take๋Š” ์ˆซ์ž์™€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐœ์ˆ˜๋งŒํผ์˜ ์›์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Prelude> take 3 [1,2,3,4] [1,2,3] Prelude> take 5 [1,2,3,4] [1,2,3,4]
  • 11.
    List - ์—ฐ์‚ฐ drop์€๋ฐ˜๋Œ€๋กœ ์ฃผ์–ด์ง„ ๊ฐœ์ˆ˜๋งŒํผ์˜ ์›์†Œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Prelude> drop 3 [1,2,3,4] [4] Prelude> drop 5 [1,2,3,4] [] maximum / minimum์€ ๊ฐ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Prelude> maximum [1,2,3,4] 4 Prelude> minimum [1,2,3,4] 1
  • 12.
    List - ์—ฐ์‚ฐ sum/ product๋Š” ๊ฐ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋“ค ๋ชจ๋‘๋ฅผ ๋”ํ•œ ๊ฐ’๊ณผ ๋ชจ๋‘๋ฅผ ๊ณฑํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Prelude> sum [1,2,3,4] 10 Prelude> product [1,2,3,4] 24 elem์€ ์›์†Œ ํ•˜๋‚˜์™€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ์›์†Œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋˜๋Š”์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•ด์ค๋‹ˆ๋‹ค. Prelude> โ€˜aโ€™ `elem` โ€œabcdโ€ True Prelude> 3 `elem` [1,2,4,5] False
  • 13.
    List - ๋ฒ”์œ„ Haskell์—๋Š”ํŠน์ • ๋ฒ”์œ„์— ์žˆ๋Š” ๊ฐ’๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฌธ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„(range) ๋ฆฌ์ŠคํŠธ๋Š” ํŠน์ • ๋ฒ”์œ„์— ์žˆ๋Š” ๋“ฑ์ฐจ ์ˆ˜์—ด์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. Prelude> [1..10] [1,2,3,4,5,6,7,8,9,10] ๊ธฐ๋ณธ์ ์œผ๋กœ [(์‹œ์ž‘๊ฐ’)..(์ข…๋ฃŒ๊ฐ’)] ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ์‹œ์ž‘๊ฐ’์—์„œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ์ข…๋ฃŒ๊ฐ’๊นŒ์ง€์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Prelude> [โ€˜aโ€™..โ€™zโ€™] โ€œabcdefghijklmnopqrstuvwxyzโ€ Prelude> [โ€˜Aโ€™..โ€™Fโ€™] โ€œABCDEFโ€
  • 14.
    List - ๋ฒ”์œ„ ๊ฐ’์˜์ฆ๊ฐ€ ์ •๋„๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ ์›์†Œ์™€ ๋‘๋ฒˆ์งธ ์›์†Œ๊นŒ์ง€ ํ‘œ๊ธฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ ๋‘ ์›์†Œ์˜ ์ฐจ์ด๋งŒํผ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ์ฃผ์–ด์ง„ ๋ฒ”์œ„ ๋‚ด์˜ ์›์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. Prelude> [1,4..10] [1,4,7,10] Prelude> [โ€˜aโ€™,โ€™cโ€™..โ€™zโ€™] โ€œacegikmoqsuwyโ€ Prelude> [0.1, 0.3 .. 1] [0.1,0.3,0.5,0.7,0.899999999999,1.0999999999999] ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ๊ฒฝ์šฐ ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ถ€์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ๋ฒ•์—์„œ๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์ ์€ ๋˜๋„๋ก ์•ˆ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • 15.
    List - ๋ฒ”์œ„:๋ฌดํ•œ Haskell์€์ง€์—ฐ ๊ณ„์‚ฐ์ด๋ผ๋Š” ํŠน์ง•์„ ์ด์šฉํ•ด์„œ ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์˜ ๋ฒ”์œ„ ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ƒ๋žตํ•˜๋ฉด ๊ณง ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. Prelude> let evens = [2,4..] ์ด์ œ evens๋Š” ์ง์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ evens๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ๊นŒ์ง€๋Š” ์ง€์—ฐ ๊ณ„์‚ฐ์˜ ํŠน์„ฑ๋•Œ๋ฌธ์— ํ•ด๋‹น ์‹์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ฒ˜์Œ๋ถ€ํ„ฐ 10๊ฐœ์˜ ์ง์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€๋ด…์‹œ๋‹ค. Prelude> take 10 evens [2,4,6,8,10,12,14,16,18,20] ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋Š” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ๋Œ€ ๋ฆฌ์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.
  • 16.
    List - ๋ฒ”์œ„:๋ฌดํ•œ cycleํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ทธ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. Prelude> take 10 (cycle [1,2,3]) [1,2,3,1,2,3,1,2,3,1] Prelude> take 12 (cycle โ€œEE! โ€œ) โ€œEE! EE! EE! โ€œ repeat๋Š” ์›์†Œ๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ๊ทธ ์›์†Œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌดํ•œ๋Œ€ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Prelude> take 5 (repeat 3) [3,3,3,3,3] take n (repeat k)๋Š” replicate n k์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ๋ณดํ†ต replicate 5 3๊ณผ ๊ฐ™์ด ์”๋‹ˆ๋‹ค.
  • 17.
    List Comprehension list comprehension์€list๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ๋ฒ•์€ ์ˆ˜ํ•™์—์„œ ์ง‘ํ•ฉ์„ ํ‘œ๊ธฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์ œ์‹œ๋ฒ•๊ณผ ์•„์ฃผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ 10๊ฐœ์˜ ์ง์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ list comprehension์„ ์ด์šฉํ•ด ํ‘œ๊ธฐํ•ด๋ด…์‹œ๋‹ค. Prelude> [x*2 | x <- [1..10]] [2,4,6,8,10,12,14,16,18,20] list comprehension์—์„œ ํŒŒ์ดํ”„(|) ์™ผ์ชฝ์€ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ๋“ค์–ด๊ฐˆ ์›์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ํŒŒ์ดํ”„ ์˜ค๋ฅธ์ชฝ์€ ๊ทธ ์›์†Œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ๊ฑด๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ x <- [1..10]์„ ํ†ตํ•ด x ๋Š” ๋ฆฌ์ŠคํŠธ [1..10] ์†์— ์†ํ•˜๋Š” ์›์†Œ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ทธ ๊ฐ๊ฐ์˜ x์— ๋Œ€ํ•ด 2๋ฅผ ๊ณฑํ•œ ๊ฐ’์ด ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ๋‹ค๊ณ  ํ‘œ๊ธฐํ–ˆ์œผ๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ ์ฒซ 10๊ฐœ์˜ ์ง์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • 18.
    List Comprehension ๋ช‡ ๊ฐ€์ง€์˜ˆ์ œ๋ฅผ ๋” ์‚ดํŽด๋ด…์‹œ๋‹ค. ์šฐ์„ , ์ฒซ 10๊ฐœ์˜ ์ง์ˆ˜ ์ค‘์—์„œ ํฌ๊ธฐ๊ฐ€ 10์ด์ƒ์ธ ์ง์ˆ˜๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ list comprehension์„ ํ†ตํ•ด ๊ตฌํ•ด๋ด…์‹œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํŒŒ์ดํ”„(|) ์˜ค๋ฅธ์ชฝ์— ์กฐ๊ฑด(์ˆ ์–ด)๋ฅผ ๋”ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Prelude> [x*2 | x <- [1..10], x*2 >= 10] [10,12,14,16,18,20] 1๋ถ€ํ„ฐ 20 ์‚ฌ์ด์˜ ์ˆซ์ž์ค‘ 3 ๋˜๋Š” 5์˜ ๋ฐฐ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? Prelude> [x | x <- [1..20], x `mod` 3 == 0 || x `mod` 5 == 0] [3,5,6,9,10,12,15,18,20]
  • 19.
    List Comprehension list comprehension์—์„œ์ˆ ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ค„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์›์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, [1,2,3]๊ณผ [4,5,6]์˜ ๋ชจ๋“  ์›์†Œ๋“ค์˜ ๊ณฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์›์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค. Prelude> [x*y | x <- [1,2,3], y <- [4,5,6] ] [4,5,6,8,10,12,12,15,18] Prelude> [x*y | x <- [1,2,3], y <- [4,5,6], x*y > 10] [12,12,15,18] ์ด๊ฑด ๋งˆ์น˜ ๋ช…๋ นํ˜• ์–ธ์–ด์—์„œ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. [1,2,3]์—์„œ ์›์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๊ณ , ๊ทธ ์›์†Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด y์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ๋Œ€์‘์‹œํ‚ค๋ฉด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ด…๋‹ˆ๋‹ค.
  • 20.
    List Comprehension list comprehension์—ญ์‹œ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด list์˜ list์—์„œ ๋‚ด๋ถ€์˜ list๋“ค์— ๋Œ€ํ•ด ์ง์ˆ˜์ธ ์›์†Œ๋“ค์€ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค. first.hs removeOdd xxs = [ [ x | x <- xs, odd x] | xs <- xxs] ghci Prelude> :l first.hs Prelude> removeOdd [[1,2,3,4], [5,6,7,8], [2,4,6,8], [1,3,5,7]] [[1,3],[5,7],[],[1,3,5,7]] list comprehension์€ ์ค‘์ฒฉํ•ด์„œ ์“ธ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋• ์—ฌ๋Ÿฌ ์ค„์— ๋‚˜๋ˆ ์„œ ์“ฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฑธ ๊ณ ๋ฏผํ•ด๋ณด์‹œ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
  • 21.
    ์—ฐ์Šต ๋ฌธ์ œ โ€ข lastButOne list๊ฐ€ ์ฃผ์–ด์ง€๋ฉดํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์—์„œ ํ•œ ์นธ ์•ž ์›์†Œ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด lastButOne [1,2,3,4]๋Š” 3์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. โ€ข notCapital ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ๋ฌธ์ž์—ด์—์„œ ๋Œ€๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด notCapital โ€œHaHaHa, NotCapitalโ€ ์€ โ€œaaa, otapitalโ€์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. โ€ข diff ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ a,b๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ a์˜ ์›์†Œ ์ค‘ b์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์›์†Œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด diff [1,2,3,4,5,6] [3,5,7] ์€ [1,2,4,6]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • 22.
    tuple tuple์€ list์™€ ๋น„์Šทํ•˜๊ฒŒ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๋‹ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. tuple์ด list์™€ ์ฐจ์ด ๋‚˜๋Š” ๋‘ ๊ฐ€์ง€๋Š”, tuple์€ ์›์†Œ ๊ฐœ์ˆ˜๊ฐ€ ๊ณ ์ •์ด๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’๋„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. tuple์€ ์†Œ๊ด„ํ˜ธ์™€ ์ฝค๋งˆ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์€ ์ˆ˜ํ•™์—์„œ ๋ฒกํ„ฐ ๋“ฑ์„ ํ‘œ๊ธฐํ•˜๋Š”๋ฐ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠœํ”Œ์˜ ํ•œ ๊ฐ€์ง€ ํŠน์ง•์€ ์›์†Œ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Prelude> [(1,2), (1,2,3)] <interactive>:2:9: Couldnโ€™t match expected type โ€˜(t, t3)โ€™ with actual type โ€˜(t0, t1, t2)โ€™ Relevant bindings include it :: [(t, t3)] (bound at <interactive>:2:1) In the expression: (1,2,3) In the expression: [(1,2), (1,2,3)] In an equation for โ€˜itโ€™ : it = [(1,2), (1,2,3)] ์ด๋ ‡๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ํ•œ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • 23.
    tuple ํŠœํ”Œ์€ ์ˆ˜ํ•™์—์„œ์˜ 2์ฐจ์›,3์ฐจ์› ๋ฒกํ„ฐ ๋“ฑ์„ ํ‘œ๊ธฐํ•  ๋•Œ๋‚˜, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ 2์ธ ํŠœํ”Œ์„ ํŽ˜์–ด(pair), 3์ธ ํŠœํ”Œ์„ ํŠธ๋ฆฌํ”Œ(triple)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํŽ˜์–ด์˜ ๊ฒฝ์šฐ fst์™€ snd ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Prelude> fst (1,4) 1 Prelude> snd (1,4) 4 fst์™€ snd ํ•จ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2์ธ ํŠœํ”Œ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 3-tuple, 4-tuple, ... ๋“ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ํŠœํ”Œ์— ๋Œ€ํ•ด ๊ฐ ์›์†Œ๋“ค์„ ๋ฝ‘์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์— ๋‹ค๋ค„๋ด…์‹œ๋‹ค.
  • 24.
    tuple pair๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”zip์ด๋ผ๋Š” ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ง ์ง€์€ ํŽ˜์–ด๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Prelude> zip [โ€˜oneโ€™, โ€˜twoโ€™, โ€˜threeโ€™] [1,2,3] [(โ€˜oneโ€™,1), (โ€˜twoโ€™,2), (โ€˜threeโ€™,3)] Prelude> zip [1..] โ€œabcdโ€ [(1,โ€™aโ€™), (2,โ€™bโ€™), (3,โ€™cโ€™), (4,โ€™dโ€™)] zip์€ ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ฑฐ๋‚˜ ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋™์‹œ์— ์ˆœํšŒํ•ด์•ผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. zip์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๊ธธ์ด๊ฐ€ ์งง์€ ์ชฝ์˜ ๋ฆฌ์ŠคํŠธ์— ๋งž์ถฐ์„œ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.
  • 25.
    ํ™œ์šฉ tuple๊ณผ list๋ฅผ ์ด์šฉํ•ด์„œ๋‹ค์Œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด…์‹œ๋‹ค. โ€œ์„ธ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ๋ชจ๋‘ 10์ดํ•˜์˜ ์ •์ˆ˜์ธ ์‚ผ๊ฐํ˜• ์ค‘์—์„œ, ๋‘˜๋ ˆ๊ฐ€ 24์ธ ์ง๊ฐ ์‚ผ๊ฐํ˜•์—๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋Š”๊ฐ€?โ€ ์ด ๋ฌธ์ œ๋Š” list comprehension๊ณผ tuple์„ ์ด์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  list comprehension์„ ์ด์šฉํ•ด ์„ธ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ ๋ชจ๋‘ 10์ดํ•˜์ธ ์‚ผ๊ฐํ˜• ๋ชฉ๋ก์„ ๊ตฌํ•ด๋ด…์‹œ๋‹ค. [(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10]]
  • 26.
    ํ™œ์šฉ ์—ฌ๊ธฐ์„œ ์ง๊ฐ ์‚ผ๊ฐํ˜•์˜๊ฒฝ์šฐ ๋น—๋ณ€ ๊ธธ์ด์˜ ์ œ๊ณฑ์€ ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€์˜ ๊ธธ์ด์˜ ์ œ๊ณฑ์˜ ํ•ฉ๊ณผ ๊ฐ™์œผ๋ฉฐ, ์ง๊ฐ์‚ผ๊ฐํ˜•์˜ ๊ฐ ๋ณ€์€ ๋น—๋ณ€์˜ ๊ธธ์ด๋ณด๋‹ค ๊ธธ ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด์„ ๋ฐ˜์˜ํ•ด๋ด…์‹œ๋‹ค. [(a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์กฐ๊ฑด์€ ๋‘˜๋ ˆ๊ฐ€ 24๋ผ๋Š” ์กฐ๊ฑด ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด ํ•˜๋‚˜๊นŒ์ง€ ๋ฐ˜์˜ํ•ด์„œ ๋‹ต์„ ๊ตฌํ•ด ๋ด…์‹œ๋‹ค. Prelude> [(a,b,c)| c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, a+b+c==24] [(6,8,10)]
  • 27.
    ์—ฐ์Šต ๋ฌธ์ œ โ€ข swap ํŽ˜์–ด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด swap [(1,2), (3,4), (5,6), (7,8)]์€ [(2,1), (4,3), (6,5), (8,7)]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. โ€ข sum ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์ด๋ฏธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜๋‹ˆ sum ์™ธ์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด sumโ€™ [1,2,3,4,5] ๋Š” 15๋ฅผ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. โ€ข divisors ์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ›์•„ ๊ทธ ์ˆซ์ž์˜ ๋ชจ๋“  ์•ฝ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด divisors 20 ์€ [1,2,4,5,10,20]์„ ๋ฆฌํ„ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.