리스트(list)는 여러 개의 값을 순차적으로 저장하는 자료구조다.
- 리스트의 모든 원소는 동일한 타입을 가진다.
- 튜플은 다른 타입이 섞일 수 있음( 차이점 )
- 리스트 타입은 [type] list로 표기한다.
- type : 원소타입
- e.g. int list, string list, ....
- 리스트 생성은 대괄호[]를 사용하고 원소들의 구분은 세미콜론(;)을 사용한다.
- e.g. [], [1;2;3], ['a';'b';'c']...
- 리스트 연산자
- :: <- 이건 리스트 앞에 원소를 삽입하여 새로운 리스트(기존 리스트x)를 반환해 준다. (,뒤에는 원소를 삽입할 수 없다.)
- e.g. 0::[1;2;3] -> [0;1;2;3]을 반환한다.
- @ <- 이건 리스트끼리 연결하여 새로운 리스트를 반환해 주는 기호이다.
- e.g. [1;2;3] @ [4;5;6] -> [1;2;3;4;5;6]을 반환한다.
- :: <- 이건 리스트 앞에 원소를 삽입하여 새로운 리스트(기존 리스트x)를 반환해 준다. (,뒤에는 원소를 삽입할 수 없다.)
Library for List
OCaml엔 List에 대한 내장 라이브러리를 지원한다.
- List.iter : ('a -> unit) -> 'a list ->unit 이것은 함수와 리스트를 인자로 받아, 각 리스트원소에 함수를 적용하는 함수이다.
- e.g. List.iter (fun x -> Format.printf "%d" x) [1;2;3]
- List.map : ('a -> 'b) -> 'a list -> 'b list 이것은 함수와 리스트를 받아, 리스트의 원소에 함수를 적용한 새로운 리스트를 반환한다.
- e.g. List.map (fun x -> x+1 ) [1;2;3] -> [(fun x -> x+1) 1;[(fun x -> x+1) 2;[(fun x -> x+1) 3; ]
- List.fold_left : ('b -> 'a -> 'b) -> 'b 0> 'a list -> 'b 이것은 함수, 값, 리스트를 받아 첫 원소부터 함수를 적용한 겹치기(누적하여 적용)를 수행한다.
- e.g. List.fold.left (fun i x -> i+x) 0 [1;2;3] -> (fun i x -> i+x) ((fun i x -> i +x) ((fun i x -> i+x)0 1) 2) 3
Pattern matching for lists
리스트를 대상으로 패턴매칭을 통한 case analysis. 리스트 타입의 값에 대한 가능한 경우의 수는 크게 두 가지가 있다.
- [] : 빈 리스트인 경우
- h :: t : 리스트에 원소가 존재하는 경우 (h: 첫 번째 원소, t: 나머지 리스트)
Type definition
OCaml에선 사용자가 새로운 타입을 정의할 수 있다.
- type [type_name] = [type]
- type_name : 새로운 타입 이름(무조건 소문자)
- type : 기존 타입
- 타입 정의를 통해 기존 타입에 새로운 이름을 부여할 수 있다.
- c/c++의 typedef와 비슷하다.
Tyep definition
Disjoint union (합집합)
: 구분되는 식별자를 사용하여 여러 타입을 묶은 타입
- Variant records 라고도 부른다.
- A 혹은 B로 구성된 타입
- [형식] type 새로운 타입이름(소문자로) = (대문자로 시작)식별자[Constructor] of 원래타입(생략가능)
Example
Pettern matching for disjoint union
합집합의 경우 패턴매칭 Constructor를 통해 수행된다.
'학교 공부 > 프로그래밍 언어 개론' 카테고리의 다른 글
[프로그래밍 언어] 언어의 구조와 의미1 (0) | 2023.04.19 |
---|---|
[Ocaml] Tail Call Optimization (0) | 2023.04.19 |
[Ocaml] Pattern matching (expression) (0) | 2023.04.11 |
[Ocaml] Module system (0) | 2023.04.09 |
[Ocaml] Statement? Expression?, OCaml basic (0) | 2023.04.08 |