์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #2
by JiwonDev
์ด ๊ธ์์๋ ํ์ค์ผ ์ค์น๋ฐฉ๋ฒ์ ๋ํด ์ธ๊ธํ์ง ์์ต๋๋ค.
ํ์ํ๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์ค์ผ ๊ฐ๋ฐ์ ํ์ํ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ฃผ์ธ์.
2021.03.11 - [๊ฐ๋ฐ ์ธ์ด/Haskell] - ํ์ค์ผ ๊ฐ๋ฐํ๊ฒฝ (stack + IntelliJ plugin)
ํ์ค์ผ์ ์ ๋ง ์๊ฒฉํ ๋ฌธ๋ฒ์ ๊ฐ์ง ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ์ Main์ฝ๋๋ถํฐ ์์ฑํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋ณดํต stack ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ณผ์ ์ด ๊ท์ฐฎ๋ค๋ฉด ์๋ ์ฌ์ดํธ๋ฅผ ์ด์ฉํฉ์๋ค.
Try Haskell! An interactive tutorial in your browser
#0. ํ์ค์ผ ์์ค์ฝ๋
ํ์ค์ผ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๋์ถฉ ์ดํด๋ด ์๋ค. ๋ชจ๋ฅด๋ ๋ฌธ๋ฒ์ ์ฒ์ฒํ ์์๊ฐ๋ฉด ๋๋, ์ผ๋จ ๋์ด๊ฐ์๋ค.
-- Main.hs
-- Coord ๋ณ์ ์ ์. ๋ค๋ฅธ ์ธ์ด์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋๊ฒ ์๋๋ผ ์ ์๋ง ํ๋ค.
type Coord = (Double, Double)
-- Config ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ (์ ํํ๋ ์ ์๋ง ํ๋ค.)
data Config = Config {
rotAt :: Coord
, theta :: Double
, ofs :: (Double, Double)
}
-- ๊ฐ๋จํ ํจ์ ์ ์ ๋ฐฉ๋ฒ. ๋ณ์์ ์ ์์ ๋์ผํ๋ค.
type CoordConverter = Coord -> Coord
-- ์ด๋ฐ์์ผ๋ก ํจ์๋ฅผ ์ฌ์ฉํด์ ์ฝ๋์ ๊ฐ๋
์ฑ์ ์ง๊ด์ ์ผ๋ก ๋ง๋ ๋ค.
-- trans ํจ์ ์ ์, dx์ dy๋ฅผ ์
๋ ฅ๋ฐ์ (x,y)์ ๋ํ๋ค.
trans :: (Double, Double) -> CoordConverter
trans (dx, dy) = \(x,y) -> (x+dx, y+dy)
-- rotate ํจ์ ์ ์, t๋ฅผ ์
๋ ฅ๋ฐ์ (x,y)์ ๋ํ๋ค.
rotate :: Double -> CoordConverter
rotate t = \(x, y) -> ( x + t, y + t)
-- transByConfig ํจ์ ์ ์, config ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ trans ํจ์๋ฅผ ์ ์ฉํ๋ค.
-- config ๊ฐ์ฒด ์์ ์๋ ofs๋ฅผ trans ํจ์์ ์ ์ฉํ๋ค.
-- ofs :: (Double, Double)
transByConfig :: Config -> CoordConverter
transByConfig config = trans (ofs config)
-- rotateByConfig ํจ์ ์ ์, ๋ง์ฐฌ๊ฐ์ง๋ก config ๊ฐ์ฒด์ ์์ฑ๊ฐ์ rotate ํจ์์ ์ ์ฉ
-- theta :: Double
rotateByConfig :: Config -> CoordConverter
rotateByConfig config = postTrans . rotate (theta config) . preTrans where
-- ์์์ ๋ง๋ ํจ์๋ค์ ์ฌ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์๋ฅผ ์ ์ํ๋ค.
rotateAt = rotAt config
preTrans = trans (rotate pi $ rotateAt)
postTrans = trans rotateAt
convertByConfig :: Config -> CoordConverter
convertByConfig config = transByConfig config . rotateByConfig config
-- ๋ฉ์ธ์ฝ๋ ์ ์
-- ์ฝ๋๊ฐ ํ์ค์ด ์๋๋ผ๋ฉด do ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ์ค๋ก ์์ฑ ํ ์ ์๋ค.
-- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ฝ์ ์
๋ ฅ์ ์ ์ํ ์ ์๋ค. ๊ทธ๋์ ๋ชจ๋๋ IO() ๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ค.
main :: IO ()
main = do
let config = Config { rotAt = (0.5,0.5), theta = pi / 4, ofs = (-0.5, -0.5) }
let unitRect = [(0,0),(0,1),(1,1),(1,0)]
let convertedRect = map (convertByConfig config) unitRect
#1. ์๋ฃํ
ํ์ค์ผ ๊ธฐ๋ณธ ํ์ ์ Int, Integer, Double, Float, Bool, Char, String์ด ์๋ค.
์๋ฃํ์ ๊ธฐ๋ณธ์ ์ผ๋ก let ์ผ๋ก ์ ์ธํ๋, ๋ณดํต ์๋ตํด์ ์ฌ์ฉํ๋ค.
- Int๋ ์ต์ -2^29๋ถํฐ +2^29์ ๋ฒ์๋ฅผ ๋ณด์ฅํ๋ ์ ์์ ๋๋ค. (* OS์ ๋ฐ๋ผ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.)
- Integer๋ ๊ฐ์ ํ๊ณ๊ฐ ์๋ ์ ์ ํ์ ์ด๋ค.
- Double๊ณผ Float๋ ๊ฐ๊ฐ ๋ฐฐ์ ๋ฐ๋, ๋จ์ ๋ฐ๋ ๋ถ๋์์์ ์ ํ์ ์ด๋ค.
- Bool์ True์ False๋ฅผ ์ ์ดํ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ๋ถ๋ฆฌ์ธ ํ์ ์ด๋ค.
- Char๋ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ํํํ๋ ํ์ ์ด๋ค.
- String์ Char์ ๋ฆฌ์คํธ์ง๋ง, ๋ฌธ์์ด ํํ์ ํ์ฉํ ํ์ ์ด๋ค.
let lostNumbers = [4,8,15,16,23,42]
-- let์ ์๋ตํด๋ ์๊ด์๋ค.
-- lostNumbers = [4,8,15,16,23,42]
"HELLO"
-- ํ์ค์ผ์์ ์คํธ๋ง์ ๋ฌธ์์ด์ ํ์ฉํ ๋ฆฌ์คํธ ์๋ฃํ์ด๋ค.
-- ['H','E','L','L','O']
-- types.hs
i :: Int
i = -78
biggestInt, smallestInt :: Int
biggestInt = maxBound -- ์๋ฃํ์ ์ต๋๊ฐ์ ๋ฐํํ๋ ํจ์
smallestInt = minBound -- ์๋ฃํ์ ์ต์๊ฐ์ ๋ฐํํ๋ ํจ์
-- ์์ ํฌ๊ธฐ ์ ์
n :: Integer
n = 1234567890987654321987340982334987349872349874534
19 - 27
(-3) * (-7) -- ์์๋ฅผ ์ฌ์ฉํ ๋๋ ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค.
-- ๋ฐฐ์ ๋ฐ๋ ๋ถ๋์์์ ์
d1, d2 :: Double
d1 = 4.5387
d2 = 6.2831e-4
-- ๋ถ๋ฆฌ์ธ
b1, b2, b3 :: Bool
b1 = True
b2 = False
b3 = not (False || b1) && ( b2 || True)
-- ์ ๋์ฝ๋ ๋ฌธ์
c1, c2, c3 :: Char
c1 = 'x'
c2 = 'Ø'
c3 = 'ใ'
-- ๋ฌธ์์ด
s :: String
s = "Hello, Haskell!"
์ฐธ๊ณ ๋ก ํ์ค์ผ์ ์๋ฃํ์ ๋งค์ฐ ์๊ฒฉํ ๊ท์น์ ๊ฐ์ง๊ณ ์๋ค.
True == 1
-- ์ปดํ์ผ ์๋ฌ!
5 + 4.0
-- ์ด๋ 5(INT)๊ฐ 5.0(DOUBLE)์ผ๋ก ๋ณํ๋์ด ์ธ์ํ๊ฒ ๋๋ค.
-- ๋จ ๋ฐ๋๋ก doubleํ์ด int๋ก ์บ์คํ
๋๋ ๊ฒฝ์ฐ๋ ์๋ค. ํ๋ฉด ์ปดํ์ผ ์๋ฌ!
#2. ํจ์
ํ์ค์ผ์์๋ ํจ์๋ ๋ณ์์ ๋์ผํ๊ฒ ์ ์(์ ์ธ)ํด์ฃผ์ด์ผ ํ๋ค.
ํจ์๋ฅผ ์ ์ํ ๋, ํจ์ ์ด๋ฆ๊ณผ ํ๋ผ๋ฉํ ๋ณ์ ์ฌ์ด ๊ณต๋ฐฑ๋ง์ผ๋ก ๊ตฌ๋ถ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ดํธ๋ฅผ ์๋ตํด๋ ์๊ด์๋ค.
- ์ด๋ฆ :: ์ ์ธ ๋ณ์์ ๋๊ฐ์ด :: ๊ธฐํธ๋ฅผ ์ฌ์ฉํด ์ ์ํ๋ค.
-> ๋ ์ผ์ชฝ ํ์ ์ ๊ฐ์ ์ธ์(์ ๋ ฅ, ๋งค๊ฐ๋ณ์)๋ก ๋ฐ์์ ์ค๋ฅธ์ชฝ์ ์ ๋ฌํ๋ ํจ์๋ผ๋ ์๋ฏธ์ด๋ค.
parity :: Integer -> Integer
parity n = if (n `mod` 2) == 0 then 0 else 1
-- parity n = n `mod` 2 ๋ก๋ ๊ฐ๋ฅ
{- ์ฐธ๊ณ ๋ก mod๊ฐ์ ํจ์๊ฐ ๊ฐ ๊ฐ์ด๋ฐ ๋ค์ด๊ฐ ๋๋ ' ' ๋ฅผ ์ฌ์ฉํ๋ค. -}
mod 19 3
19 'mod' 3
- ๋ค์๊ณผ ๊ฐ์ ์ฌ๊ท์ ์ธ ํธ์ถ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
-- sumtorial.hs
-- 1๋ถํฐ n๊น์ง ์ ์์ ํฉ์ ๊ณ์ฐํ๋ค
sumtorial :: Integer -> Integer
sumtorial 0 = 0
sumtorial n = n + sumtorial (n-1)
- ์ธ์๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ปค๋ง(currying)์ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ํ ์ ์๋ค.
-- args.hs
f :: Int -> Int -> Int -> Int
f x y z = x + y + z
ex17 = f 3 17 8 -- 28
- ๋ฌผ๋ก , ๊ธฐ์กด์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ํํ(Pair)๋ก ๋ฌถ์ด์ ํ๋์ฒ๋ผ ์ฌ์ฉ ํ ์ ๋ ์๋ค.
p :: (Int, Char)
p = (3, 'x')
-- sumPair.hs
sumPair :: (Int,Int) -> Int
sumPair (x,y) = x + y
#3. ํจ์์ ์ปค๋ง (Curring)
์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฐ๋ ํจ์๋ฅผ ๋ถ๋ฆฌํ์ฌ, ์ธ์๋ฅผ ํ๋์ฉ๋ง ๋ฐ๋๋ก ๋ง๋๋ ๊ธฐ๋ฒ์ด๋ค.
๊ตฌํ์ ์กฐ๊ธ ์ด๋ ค์ธ ์ ์์ง๋ง, ํจ์์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ์ฌ๋ ค์ค๋ค๋ ์ฅ์ ์ด ์๋ค.
ํจ์๋ฅผ ๋ณ์์ฒ๋ผ ๋ฐํ ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฐํ ๊ฐ์ ํจ์๋ฅผ ๋ฃ์ด ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ดํดํ๊ธฐ ์ฝ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์๋ฅผ ๋ค์ด๋ณด์
// uncurrying
function greet(greeting, name){
console.log(greeting + , ", " + name);
}
greeting("Hello","Jiwon");
// currying
function greet(greeting){
return function(name){
console.log(greeting + ", " + name);
}
}
greet('Hello')('Jiwon')
ํจ์์ ๊ตฌํ์ ๊น๋ค๋กญ๊ฒ ๋ณด์ผ ์ ์์ง๋ง, ์ปค๋ง์ ์ด์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฒด์ด๋(Chaining) ๋ฌธ๋ฒ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค
function multiplyThree(x) {
return function(y) {
return function(z) {
return x * y * z;
}
};
}
multiplyThree(4)(8)(2);
// multiplyThree(x) ์ ๋ฐํ๊ฐ์ function์ด๋ผ ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ฐ๋ฐ์๋ค๋ ์ด๋ ๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ด๋ ต๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค๋ ๊ฑธ ์๊ณ ์๊ธฐ์, ๋ณดํต ํ์ค์ผ ์ฒ๋ผ ํ ์ค๋ก ์์ฑํ ์ ์๋ ํจ์ํ ๋ฌธ๋ฒ(ํ์ดํ ํจ์, ๋๋ค ๋ฑ)์ ๋ฐ๋ก ์ ๊ณตํด์ค๋ค.
// ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ดํ ํจ์, ์์ greet()๊ณผ ๋์ผํ ํจ์์ด๋ค.
greet = greeting => name => console.log(greeting + ', ' + name);
// = gretting => function() {...}
// = gretting => ( name => console.log )
greet('Hello')('name')
mulriplyThree = x => y => z => x * y * z;
multiplyThree(4)(8)(2);
#4. ์กฐ๊ฑด๋ฌธ (if, guard)
- ํ์ค์ผ์์ if๋ฌธ์ ์ง์ํ๊ธด ํ์ง๋ง, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์์๋ ์ ์ฌ์ฉํ์ง๋ ์๋๋ค.
-- b๊ฐ ์ฐธ์ด๋ฉด t๋ฅผ, ๊ฑฐ์ง์ด๋ฉด f๋ฅผ ๊ฐ์ผ๋ก ๋์
ํ๋ค.(์ ์ํ๋ค)
if b then t else f
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์กฐ๊ฑด ์ ์ {key : value} ๊ฐ์ ์๋ฃํ์ ์ด์ฉํด ํจํด ๋งค์นญ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
ํ์ค์ผ์์ guard( | ) ์ฐ์ฐ์๋ฅผ ์ ์ ํ ์ด์ฉํด์ ํจํด ๋งค์นญ์ ๊ตฌํํ ์ ์๋ค..
parity2 :: Integer -> Integer
parity2 n
| n `mod` 2 == 0 = 100 // n%2 == 0 ์ด๋ฉด 100 ๋ฐํ
| otherwise == 1 = 200 // else 200 ๋ฐํ
// else == otherwise
count :: Integer -> String
count 0 = "ํจํด๋งค์นญ0"
count 1 = "ํจํด๋งค์นญ1"
count 2 = "ํจํด๋งค์นญ2"
count n = "Default"
๋ณดํต ์๋์ ๊ฐ์ด ์์ 2๊ฐ์ง ๋ฌธ๋ฒ์ ์ ์ ํ ์์ด ์ฌ์ฉํ๋ค.
-- foo.hs
foo :: Integer -> Integer
foo 0 = 16
foo 1
| "Haskell" > "C++" = 3
| otherwise = 4
foo n
| n < 0 = 0
| n `mod` 17 == 2 = -43
| otherwise = n + 3
#5. Type๊ณผ Data
Type
์ ์ธํ์ง ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ํ์ ๋ ์์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ง์ ํ์ ์ ๋ง๋ค์ด์ ์ฌ์ฉํด๋ ๋๋ค.
-- ์คํธ๋ง์ [Char] ํ์
์ด๋ค.
type MyString = [Char]
type Pos = (Int, Int)
str :: MyString
str = "Hello"
origin :: Pos
origin = (0, 0)
left :: Pos -> Pos
left (x, y) = (x-1, y)
- ์ฐธ๊ณ ๋ก ๊ฐ์ฒด์ ํ์ ์ ์๊ณ ์ถ๋ค๋ฉด :type ๋๋ :t ๋ฅผ ์ด์ฉํ๋ฉด ํ์ ์ ์ถ๋ ฅ ํ ์ ์๋ค.
Prelude> :type True
True :: Bool
Prelude> :t (3 < 5)
(3 < 5) :: Bool
Prelude> :t 'H' -- ๋ฐ์ํ๋ ํ ๋ฌธ์ (Char)์ ์๋ฏธํ๋ค.
'H' :: Char
Prelude> :t "Hello World" -- ์ ๋ฐ์ํ๋ ์คํธ๋ง(=๋ฆฌ์คํธ)์ ์๋ฏธํ๋ค
"Hello World" :: [Char]
Data
๋ค๋ฅธ ์ธ์ด์ MyClass a = MyClass() ์ฒ๋ผ ์์ ์๋ก์ด ์๋ฃํ์ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ Data ํค์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
-- Bool ์๋ฃํ์ False์ True๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
data Bool = False | True
-- Answer ์๋ฃํ์ Yes์ No์ Unknown์ ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
data Answer = Yes | No | Unknown
answers :: [Answer]
answers = [Yes, No, Unknown]
flip :: Answer -> Answer
flip Yes = No
flip No = Yes
flip Unknown = Unknown
data Move = Left
| Right
| Up
| Down
move :: Move -> Pos -> Pos
move Up (x, y) = (x, y-1)
move Left (x, y) = (x-1, y)
move Down (x, y) = (x, y+1)
move Right (x, y) = (x+1, y)
moves :: [Move] -> Pos -> Pos
moves [] p = p
moves (m:ms) p = moves ms (move m p)
> move Left (1, 1)
-- ์ถ๋ ฅ๊ฐ: (0,1)
> moves [Left, Right, Up, Down, Left] (0, 0)
-- ์ถ๋ ฅ๊ฐ: (-1,0)
#6. list (๋ฆฌ์คํธ)์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๋ฆฌ์คํธ๋ ๊ฐ์ ์๋ฃํ์ ๊ฐ์ง ๊ฐ๋ค์ ํ๋๋ก ํฉ์น ์ ์์ต๋๋ค. ( ์๋ฃํ์ด ๋ค๋ฅด๋ฉด ์ปดํ์ผ ์๋ฌ )
-- let์ ์๋ตํด๋ ์๊ด์๋ค.
let numbers = [1,2,3,4]
let truths = [True, False, False]
let strings = ["here", "are", "some", "strings"]
-- ์์๋ ๋งํ์ง๋ง, ํ์ค์ผ์ ๋ฌธ์์ด์ ๋ฆฌ์คํธ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
"hello"
// ['h','e','l','l','o']
-- ๋ฆฌ์คํธ ์ค์ฒฉ๋ ๊ฐ๋ฅํ๋ค.
-- ์๋์ ๊ฒฝ์ฐ ์๋ฃํ์ [Int]์ด๋ค. ์ด๋ Int์ ๋ค๋ฅธ ์๋ฃํ์ผ๋ก ํ๋จํ๋ค.
let listOfLists = [[1,2],[3,4],[5,6]]
- ๋ฆฌ์คํธ์ ๊ธฐ๋ณธ ์๋ฃํ์ ์ด์ด ๋ถ์ด๊ณ ์ถ๋ค๋ฉด ๊ฐ์ ๊ฑด๋ค์ฃผ๋ Constructor ์ฐ์ฐ์ (:)๋ฅผ ์ฌ์ฉํ๋ค.
5:[1,2,3,4]
-- ์ถ๋ ฅ๊ฐ : [5,1,2,3,4]
'๊ฐ' : "๋๋ค๋ผ๋ง"
-- ์ถ๋ ฅ๊ฐ : "๊ฐ๋๋ค๋ผ๋ง"
1:2:3:[]
-- ์ถ๋ ฅ๊ฐ : [1,2,3]
- ๋ฆฌ์คํธ๋ฅผ ์ฐ๊ฒฐํ๋ Concate ์ฐ์ฐ์(++)๋ฅผ ์ด์ฉํด ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ด ๋ถ์ผ ์ ์๋ค.
[1,2,3,4] ++ [9,10,11,12]
-- ์ถ๋ ฅ๊ฐ : [1,2,3,4,9,10,11,12]
'WO' ++ 'OT'
-- ์ถ๋ ฅ๊ฐ : 'WOOT'
['w','o'] ++ ['o','t']
-- ์ถ๋ ฅ๊ฐ : 'woot'
- ๋ฆฌ์คํธ์ ํน์ ์ธ๋ฑ์ค ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด (!! n)์ ์ฌ์ฉํ๋ค.
"Steve Buscemi" !! 6
-- ์ถ๋ ฅ๊ฐ 'B' (6๋ฒ์งธ ์ธ๋ฑ์ค ๊ฐ)
[0, 1, 2, 3, 4] !! 1
-- ์ถ๋ ฅ๊ฐ 1
- ์ด์ค์ ์ฐ์ฐ์(..)๋ฅผ ์ด์ฉํด ์ฐ์์ ์ธ ๊ฐ์ด๋ ๋ฌดํ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
[1..10] --์ถ๋ ฅ๊ฐ : [1,2,3,4,5,6,7,8,9,10]
[2,4..10] --์ถ๋ ฅ๊ฐ : [2,4,6,8,10]
[5,4..1] --์ถ๋ ฅ๊ฐ : [5,4,3,2,1]
[1,3..10] --์ถ๋ ฅ๊ฐ : [1,3,5,7,9]
[1..] -- ๋ฌดํ ๋ฆฌ์คํธ ์์ฑ
-- ๋น์ฐํ ๋ฌดํ๋ฆฌ์คํธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง๋ ์๊ณ , ์ผ๋ถ๋ฅผ ์ถ์ถํฉ๋๋ค.
-- take ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฌดํ๋ฆฌ์คํธ์ ์ผ๋ถ๋ถ ์ถ์ถ
take 10 [1..] -- ์ถ๋ ฅ๊ฐ: [1,2,3,4,5,6,7,8,9,10]
- ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์์ฑ ํ ์๋ ์๋ค. ๋ง์ฝ ๋ง์ง๋ง ๊ฐ(๋น ๋ฆฌ์คํธ)์ ์ฒ๋ฆฌ๋ฅผ ์ ์ง์์ผ๋ฉด ์ฌ๊ทํจ์๊ฐ ๋๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌดํ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
doubleList :: [Integer] -> [Integer]
doubleList [] = [] -- ๋น ๋ฆฌ์คํธ๋ฅผ ์
๋ ฅ๋ฐ์ผ๋ฉด ๋น ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
doubleList (n:ns) = (n * 2) : doubleList ns -- ๊ทธ ์ธ ์
๋ ฅ
doubleList [1,2,3,4]
-- ์ถ๋ ฅ๊ฐ : [2,4,6,8]
{- ์ด ์ฝ๋๋ ์๋์ ์ ์์ ๋๊ฐ์ด ๋์ํ๋ค. -}
doubleList 1:[2,3,4] = (1*2) : doubleList (2 : [3,4])
= (1*2) : (2*2) : doubleList (3 : [4])
= (1*2) : (2*2) : (3*2) : doubleList (4 : [])
= (1*2) : (2*2) : (3*2) : (4*2) : doubleList []
= (1*2) : (2*2) : (3*2) : (4*2) : []
= 2 : 4 : 6 : 8 : []
= [2, 4, 6, 8]
์ฐ์! ์ค๋์น ๊ณต๋ถ ๋คํ๋ค!
ํ์ค์ผ์ ๋ฌ๋์ปค๋ธ(๋ฐฐ์ฐ๋ ๊ณผ์ )์ด ๋์ฐํ ์ธ์ด์ ๋๋ค. ์ฌ๊ธฐ๊น์ง ์ฝ๋๋ค๊ณ ๊ณ ์ํ์ จ์ต๋๋ค.
์์ง ์ค๋ช ์ํ ๋ด์ฉ์ด ๋ง์ง๋ง, ์ผ๋จ ํ๋ฒ ์ฌ์ด๊ฐ๋๋ก ํฉ์๋ค.
'๐ฑBackend > Haskell' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #3 (0) | 2021.04.20 |
---|---|
์์ฃผ ๋ฉ์ง ํ์ค์ผ์ ๊ฐ์ด ๋ฐฐ์๋ณด์ #1 (0) | 2021.04.17 |
Haskell์ ํ๋ก์ ํธ ๊ตฌ์กฐ(stack project) (0) | 2021.03.25 |
ํ์ค์ผ ๊ฐ๋ฐํ๊ฒฝ (stack + IntelliJ plugin) (0) | 2021.03.11 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev