갈루아의 반서재

1. 리스트는 같은 종류의 데이터 구조이다.

2. 리스트는 대괄호로 둘러싸이며, 리스트의 값은 콤마로 구분된다.

3. ++ 연산자를 이용하여 리스트를 연결한다. 주의할 점은 하스켈은 ++ 의 왼쪽에 위치한 첫 번째 리스트 전체를 읽어들여야 하기 때문에, 항목이 많은 경우 이런 점을 고려하여야 한다.

++ 연산자는 항상 두 개의 리스트를 인자로 받는다. 따라서 ++ 를 이용하여 어떤 리스트의 끝에 단 하나의 항목을 추가하고자 하는 경우에도 그 항목을 대괄호로 감싸야 한다. 그래야 리스트로 취급하여 ++ 연산자가 정상적으로 작동한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Prelude> [1,2,3,4,5++ 5
<interactive>:49:1:
    Non type-variable argument in the constraint: Num [a]
    (Use FlexibleContexts to permit this)
    When checking that ‘it’ has the inferred type
      it :: forall a. (Num a, Num [a]) => [a]
Prelude> :t 5
5 :: Num a => a
Prelude> [1,2,3,4,5++ [5]
[1,2,3,4,5,5]
Prelude> :t [5]
[5] :: Num t => [t]
Prelude>
 
 
cs


4. : 연산자(cons 연산자)를 통해 리스트의 시작 부분에 어떤 것을 추가할 수 있다. : 연산자의 첫번재 인자는 추가될 리스트에있는 값들과 같은 타입의 단일 항목이어야 한다.

1
2
3
4
5
6
Prelude> 5 : [1,2,3,4,5]
[5,1,2,3,4,5]
Prelude>
 
 
 
cs

[1,2,3] 과 1:2:3:[] 은 문법적으로 같다.

1
2
3
4
5
6
7
8
9
Prelude> [1,2,3]
[1,2,3]
Prelude> 1:2:3:[]
[1,2,3]
Prelude>
 
 
 
 
cs


5. 문자열은 그런 문자들의 리스트이다.

6. !! 연산자를 이용하여 리스트 항목의 인덱스를 얻을 수 있다. 물론 인덱스는 0 에서부터 시작하며, 항목의 갯수보다 크게 입력하면 에러가 발생한다.

1
2
3
4
5
6
7
Prelude> "Haskell Programming" !! 9
'r'
Prelude> "Haskell Programming" !! 0
'H'
Prelude> "Haskell Programming" !! 30
*** Exception: Prelude.!!: index too large
Prelude>
cs


7. 리스트는 리스트를 항목으로 가질 수 있다. 하지만, 리스트에 포함된 리스트의 길이는 다를 수 있지만 타입은 같아야 한다. 즉, 문자 리스트와 숫자 리스트를 포함하는 리스트를 가질 수는 없다.

1
2
3
4
5
6
7
8
9
10
11
Prelude> let b = [[1,2,3], [5,6,7,9],[2,3]]
Prelude> b
[[1,2,3],[5,6,7,9],[2,3]]
Prelude> ["apple","banaba"] : b
<interactive>:63:22:
    No instance for (Num [Char]) arising from a use of ‘b’
    In the second argument of ‘(:)’, namely ‘b’
    In the expression: ["apple""banaba"] : b
    In an equation for ‘it’: it = ["apple""banaba"] : b
Prelude> [6,6,6] : b
[[6,6,6],[1,2,3],[5,6,7,9],[2,3]]
cs


8. 두 개의 리스트를 비교할 때는 <, <=, >=, > 를 이용하여 사전적 순서로 비교한다. 즉, 첫 번째 항목을 비교하고, 첫 번째 항목이 같다면, 두 번째 항목을 비교한다는 말이다.


9. head / tail / last / init

head 함수 : 리스트를 받아 첫 번째 항목을 반환한다.

tail 함수 : 리스트를 받아 첫 번재 항목을 제외한 나머지를 반환한다.

last 함수 : 리스트를 받아 제일 마지막 항목을 반환한다.

init 함수 : 리스트를 받아 제일 마지막 항목을 제외한 나머지를 반환한다.

* 비어있는 리스트에서는 사용하지 않도록 주의하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
Prelude> let m = [5,4,3,2,1]
Prelude> m
[5,4,3,2,1]
Prelude> head m
5
Prelude> tail m
[4,3,2,1]
Prelude> init m
[5,4,3,2]
Prelude> last m
1
Prelude>
 
cs


10. length 함수는 리스트를 받아서 길이를 반환한다.

11. null 함수는 리스트가 비어있는지 검사하여 True, False 값을 반환한다.

12. reverse 함수는 리스트를 역순으로 만든다.

13. take 함수는 숫자와 리스트를 받아, 리스트의 시작부분부터 주어진 숫자 만큼의 항목을 추출한다. 리스트에 있는 것보다 더 많은 항목을 얻을려고 하면 그 리스트 전체를 반환한다.

14. drop 함수는 숫자와 리스트를 받아, 리스트의 시작부분부터 주어진 숫자 만큼의 항목을 버린다.

15. maximum 함수는 순서를 매길 수 있는 항목들의 리스트를 받아 가장 큰 항목을 반환한다.

16. minimum 함수는 순서를 매길 수 있는 항목들의 리스트를 받아 가장 작은 항목을 반환한다.

17. sum 함수는 숫자들의 리스트를 받아 그들의 합을 반환한다.

18. product 함수는 숫자들의 리스트를 받아서 그들의 곱을 반환한다.

19. elem 함수는 어떤 항목과 항목들의 리스트를 받아 그 항목이 그 리스트의 항목인지를 알려준다. 주로 중위 함수처럼 호출한다.

1
2
3
4
5
6
7
8
9
Prelude> 4 `elem` [3,4,5,6]
True
Prelude> 99 `elem` [3,4,5,6]
False
Prelude> elem 3 [3,4,5,6]
True
Prelude> elem 88 [3,4,5,6]
False
Prelude>
cs