์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #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์ ๋ฐฐ์ ์คํ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํด๋ด ์๋ค.
'๐ฑBackend > Haskell' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #2 (0) | 2021.04.17 |
---|---|
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #1 (0) | 2021.04.17 |
Haskell์ ํ๋ก์ ํธ ๊ตฌ์กฐ(stack project) (0) | 2021.03.25 |
ํ์ค์ผ ๊ฐ๋ฐํ๊ฒฝ (stack + IntelliJ plugin) (0) | 2021.03.11 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev