갈루아의 반서재

하스켈에서 리스트는 같은 타입을 가진 연속된 값을 의미한다. 아래는 리스트는 만드는 간단한 방법으로, 각각의 타입에 주목해서 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
*Main> [7,3,8]
[7,3,8]
it :: Num t => [t]
 
 
*Main> [1,3,10,4,9.7]
[1.0,3.0,10.0,4.0,9.7]
it :: Fractional t => [t]
 
 
*Main> ['x', 10]
 
<interactive>:79:7:
    No instance for (Num Char) arising from the literal ‘10’
    In the expression: 10
    In the expression: ['x', 10]
    In an equation for ‘it’: it = ['x', 10]
 
cs


length 함수는 그 리스트에 포함된 원소의 갯수를 반환한다.

1
2
3
4
5
6
7
8
9
10
11
 
*Main> length [3,4,5]
3
it :: Int
 
*Main> length []
0
it :: Int
 
*Main> :t length
length :: Foldable t => t a -> Int
cs


head 함수는 리스트의 첫 번째 요소를 반환한다.

1
2
3
4
5
6
7
8
 
*Main> head [3,4,5]
3
it :: Num a => a
 
*Main> :t head
head :: [a] -> a
 
cs


tail 의 경우는 어떤가?

1
2
3
4
5
6
7
8
9
 
*Main> tail [3,4,5]
[4,5]
it :: Num a => [a]
 
*Main> :t tail
tail :: [a] -> [a]
*Main>
 
cs


++ 연산자는 2개의 리스트를 결합하여 새로운 리스트를 만들어낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
*Main> [3,4]++[10,20,30]
[3,4,10,20,30]
it :: Num a => [a]
 
*Main> it ++ it
[3,4,10,20,30,3,4,10,20,30]
it :: Num a => [a]
 
*Main> let f = (++) [1,2,3]
f :: Num a => [a] -> [a]
 
*Main> f [4,5]
[1,2,3,4,5]
it :: Num a => [a]
 
*Main> f[4,5] ++ reverse (f[4,5])
[1,2,3,4,5,5,4,3,2,1]
it :: Num a => [a]
 
*Main> :t (++)
(++) :: [a] -> [a] -> [a]
 
*Main> :type reverse
reverse :: [a] -> [a]
 
cs



값의 범위는 .. 을 이용하여 나타낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
*Main> [1..20]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
it :: (Enum t, Num t) => [t]
 
*Main> [-5,-3..20]
[-5,-3,-1,1,3,5,7,9,11,13,15,17,19]
it :: (Enum t, Num t) => [t]
 
*Main> length [-1000..1000]
2001
it :: Int
 
*Main> [10..5]
[]
it :: (Enum t, Num t) => [t]
 
cs


!! 연산자는 리스트의 N번째 원소를 반환한다(0에서 출발)

1
2
3
4
5
6
7
8
 
*Main> :type (!!)
(!!) :: [a] -> Int -> a
 
*Main> [10,20..100] !! 3
40
it :: (Enum a, Num a) => a
 
cs


안타깝지만, 오른쪽부터 인덱싱하기 위해 음수를 사용할 수는 없다.

1
2
3
4
5
 
*Main> [10,20..100] !! (-2)
*** Exception: Prelude.!!: negative index
 
 
cs