JiwonDev

์•„์ฃผ ๋ฉ‹์ง„ ํ•˜์Šค์ผˆ์„ ๊ฐ™์ด ๋ฐฐ์›Œ๋ณด์ž #3

by JiwonDev

์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ์ง์ ‘ GHCI๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋น„์Šทํ•œ ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค.

์‹ค์ œ Main์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑด ๋‹ค์Œ๊ธ€์— ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”์ง€ ๊ฐ€๋ณ๊ฒŒ ์•Œ์•„๋ณด๊ณ  ๊ฐ‘์‹œ๋‹ค.

 

์ฐธ๊ณ ๋กœ ํ•จ์ˆ˜๋ฅผ ์ค‘๊ฐ„์— ์ž…๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋”ฐ์Œํ‘œ( ' ~ ' ) ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜์ž„์„ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

myFunc 3 5
3 'myFunc' 5

 

0. GHCI ์‚ฌ์šฉ๋ฐฉ๋ฒ•  ( ๊ฐ•์ œ์ข…๋ฃŒ Ctrl + D ) 

์ฝ˜์†”์ฐฝ์— GHCI๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋˜๋ฉฐ ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

stack ghci

 

 

1. max min succ (successor, ํ•ด๋‹น ๊ฐ’์— +1)

ghci> succ 9
10
ghci> (succ 9) + (max 5 4) + 1  
16  

2. ์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜

doubleMe x = x + x 
ghci> :l baby  
[1 of 1] Compiling Main             ( baby.hs, interpreted )  
Ok, modules loaded: Main.

ghci> doubleMe 9  
18  
ghci> doubleMe 8.3  
16.6

3. ์ธ์ž๊ฐ€ 2๊ฐœ์ธ ํ•จ์ˆ˜

doubleUs x y = x*2 + y*2  
ghci> doubleUs 4 9  
26  
ghci> doubleUs 2.3 34.2  
73.0  

4. if๋ฌธ ์‚ฌ์šฉ (ํ•จ์ˆ˜ํ˜•์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹˜.)

ghci> :{ doubleSmallNumber x = if x > 100  
                        then x	-- ์กฐ๊ฑด์ด ์ฐธ์ธ๊ฒฝ์šฐ
                        else x*2  -- else
:}

ghci> doubleSmallNumber2 x = (if x > 100 then x else x*2) + 1  
ghci> doubleSmallNumber 99
198
ghci> doubleSmallNumber2 10
21

5. ํŠœํ”Œ

ํ•˜์Šค์ผˆ์—์„œ๋Š” ๋ชจ๋“  ๊ฐ’์„ ํ•˜๋‚˜๋กœ ๋ณด๊ณ , ํ•˜๋‚˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๋ฉด (ํŠœํ”Œ)๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

( a, b ) ์™€ ( a, b, c ) ๋Š” ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. 

( 3, "Hi" ) ์™€ ( 3, 4 ) ๋„ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์€ ๋‚ด๋ถ€์˜ ์ž๋ฃŒํ˜•๊ณผ ๊ธธ์ด๊ฐ€ ๊ฐ™์•„์•ผ ๊ฐ™์€ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

[(1,2), (3,4), (5,6)] -- ๊ฐ€๋Šฅ
[(1,2), (3,4,5), (6,7)] -- ์—๋Ÿฌ!

 

๊ธธ์ด๊ฐ€ 2์ธ ํŠœํ”Œ์€ fst์™€ snd๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ghci> fst (8,11)  
8  
ghci> fst ("Wow", False)  
"Wow" 

ghci> fst(1,2,3) -- ์—๋Ÿฌ!

 

zip [..] [..] ๋ฅผ ์ด์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๊ธธ์ด๊ฐ€ 2์ธ ํŠœํ”Œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ghci> zip [1..] ["one", "two", "three", "four", "five"]  
[(1,"one"),(2,"two"),(3,"three"),(4,"four"),(5,"five")]  

ghci> zip [5,3,2,6,2,7,2,5,4,6,6] ["im","a","turtle"]  
[(5,"im"),(3,"a"),(2,"turtle")]  

6. ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜ (์ƒ์„ฑ)

๋ฆฌ์ŠคํŠธ Comprehension์€ ๋ฆฌ์ŠคํŠธ ๋‚ด์— ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์‹์„ ์ ์–ด ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

[ ์ถœ๋ ฅ ๊ฐ’ | ์ƒ์„ฑ ๊ทœ์น™, ์กฐ๊ฑด ]

ghci> let mylist = [ (a,b,c) | a <- [1], b <- [1,2], c <- [1..3] ]  
ghci> mylist
[(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,2),(1,2,3)]

ghci> [x*2 | x <- [1..10]]  
[2,4,6,8,10,12,14,16,18,20]  

ghci> [x*2 | x <- [1..10], x*2 >= 12]  
[12,14,16,18,20]  

ghci> [ x | x <- [50..100], x `mod` 7 == 3]  
[52,59,66,73,80,87,94]   

 

  • ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ›์•„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ghci> boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
-- xs ์ค‘ ์ง์ˆ˜๋งŒ ์ž…๋ ฅ๋ฐ›์•„์„œ if .. ์กฐ๊ฑด์— ๋„ฃ์Œ.

ghci> boomBangs [7..13]  
["BOOM!","BOOM!","BANG!","BANG!"]   
ghci> removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]  

ghci> removeNonUppercase "Hahaha! Ahahaha!"  
"HA"  
ghci> removeNonUppercase "IdontLIKEFROGS"  
"ILIKEFROGS"   

 

  • ์กฐ๊ฑด์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
-- /= ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ != ์™€ ๊ฐ™์€ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
ghci> [ x | x <- [10..20], x /= 13, x /= 15, x /= 19]  
[10,11,12,14,16,17,18,20]  
ghci> [ x*y | x <- [2,5,10], y <- [8,10,11]]  
[16,20,22,40,50,55,80,100,110]   

 

  • ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
ghci> let nouns = ["hobo","frog","pope"]  
ghci> let adjectives = ["lazy","grouchy","scheming"]  
ghci> [adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns]  
["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog",  
"grouchy pope","scheming hobo","scheming frog","scheming pope"]  

 

  • ์ž…๋ ฅ ๊ฐ’์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ _ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
length xs = sum [1 | _ <- xs] 
-- xs์˜ ์š”์†Œ ๊ฐฏ์ˆ˜๋งŒํผ 1์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
-- ๊ทธ 1์„ ๋”ํ•˜๋ฉด ๊ธธ์ด๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋„ค ๋น„ํšจ์œจ์ ์ธ ์“ธ๋ชจ์—†๋Š” ํ•จ์ˆ˜์—์š”.

 

  • ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ghci> let xxs = [[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]] 

ghci> [ [ x | x <- xs, even x ] | xs <- xxs]  
[[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]  

7. ๋ฆฌ์ŠคํŠธ ํ•จ์ˆ˜

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” let์€ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. (์ž๋™์œผ๋กœ ์ธ์‹)

๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ™์€ ์ž๋ฃŒํ˜•๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ

ํ•˜์Šค์ผˆ์˜ ๋ฌธ์ž์—ด์€ ๋ฌธ์ž๋กœ ๋œ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. "HELLO" ==  ['H','E','L','L','O'] 

ghci> let lostNumbers = [4,8,15,16,23,42]  
ghci> lostNumbers  
[4,8,15,16,23,42]  

 

  • range( .. ) ์—ฐ์‚ฐ์ž๋กœ ๊ทœ์น™์ ์ธ ์š”์†Œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ghci> [1..20]  
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]  
ghci> ['a'..'z']  
"abcdefghijklmnopqrstuvwxyz"  
ghci> ['K'..'Z']  
"KLMNOPQRSTUVWXYZ" 

ghci> [2,4..20]  
[2,4,6,8,10,12,14,16,18,20]  
ghci> [3,6..20]  
[3,6,9,12,15,18]   

๋‹ค๋งŒ, ์†Œ์ˆ˜์ ์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๊ฐ’์ด ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ( ๋ถ€๋™์†Œ์ˆ˜์  ์˜ค์ฐจ )

ghci> [0.1, 0.3 .. 1]  
[0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]  

 

 

  • ์ฝœ๋ก  ( : ) ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ ๋ฌธ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ ์•ž์— ํ•ฉ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ghci> 'A':" SMALL CAT"  
"A SMALL CAT"  
ghci> 5:[1,2,3,4,5]  
[5,1,2,3,4,5]  

 

  • Conact ( ++ ) ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์–ด ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ghci> > [1,2,3,4] ++ [5,6,7,8]
[1,2,3,4,5,6,7,8]
ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3]]  
ghci> b ++ [[1,1,1,1]]  
[[1,2,3,4],[5,3,3,3],[1,2,2,3,4],[1,2,3],[1,1,1,1]]  

 

  • head๋Š” ์ฒซ๋ฒˆ์งธ ๊ฐ’์„, tail์€ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (๋งˆ์ง€๋ง‰ ๊ฐ’์€ last, ๋งˆ์ง€๋ง‰์„ ๋บ€ ๋‚˜๋จธ์ง€๋Š” init)
ghci> head [5,4,3,2,1]  
5   
ghci> tail [5,4,3,2,1]  
[4,3,2,1]   

ghci> last [5,4,3,2,1]  
1   
ghci> init [5,4,3,2,1]  
[5,4,3,2]   

ghci> head []  -- ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ์—๋Ÿฌ
*** Exception: Prelude.head: empty list  

 

  • length(๊ธธ์ด), null(๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ) reverse(๋ฐ˜์ „)
ghci> length [5,4,3,2,1]  
5  

ghci> null [1,2,3]  -- ๋นˆ ๋ฆฌ์ŠคํŠธ์ธ์ง€ ํ™•์ธ
False  
ghci> null []  
True  

ghci> reverse [5,4,3,2,1]  
[1,2,3,4,5] 

 

  • take (0~n๊ฐœ ๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ ์ถ”์ถœ), drop(n~๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ ์ถ”์ถœ)
  • take 5 [2, 4..] ์™€ ๊ฐ™์ด ์‘์šฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ghci> take 3 [5,4,3,2,1]  
[5,4,3]  
ghci> take 1 [3,9,3]  
[3]  
ghci> take 5 [1,2]  
[1,2] -- ๊ฐฏ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 
ghci> take 0 [6,6,6]  
[]  
ghci> drop 3 [8,4,2,1,5,6]  
[1,5,6]  
ghci> drop 0 [1,2,3,4]  
[1,2,3,4]  
ghci> drop 100 [1,2,3,4]  
[] 

 

  • Cycle (๊ตฌ๊ฐ„๋ฐ˜๋ณต) ๊ณผ repeat(๋‹จ์ˆœ๋ฐ˜๋ณต)์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ฌดํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌดํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด replicate ์š”์†Œ n ์œผ๋กœ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ghci> take 10 (cycle [1,2,3])  
[1,2,3,1,2,3,1,2,3,1]  
ghci> take 12 (cycle "LOL ")  
"LOL LOL LOL " 

ghci> take 10 (repeat 5)  
[5,5,5,5,5,5,5,5,5,5] 

ghci> replicate 3 10
[10,10,10]

 

  • minimum(์ตœ์†Œ), maximum(์ตœ๋Œ€), sum(์ „์ฒดํ•ฉ๊ณ„), product(์ „์ฒด๊ณฑ์…ˆ)
ghci> minimum [8,4,2,1,5,6]  
1  
ghci> maximum [1,9,2,3,4]  
9   

ghci> sum [5,2,1,6,3,2,5,7]  
31  

ghci> product [6,2,1,2]  
24  
ghci> product [1,2,5,6,7,9,2,0]  
0   

 

  • ์š”์†Œ 'elem' ( ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ )
ghci> 4 `elem` [3,4,5,6]  
True  
ghci> 10 `elem` [3,4,5,6]  
False  

 

์ด์ œ ๋Œ€์ถฉ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์ตํ˜”์œผ๋‹ˆ, ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Main์„ ๋ฐฐ์›Œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ