[함수형언어] 4주차 수업 내용 정리
05.02 4주차 수업 내용 정리
리스트(‘a list 형)
- 임의의 개수의 데이터를 다룰 수 있는 구조적 데이터
- [ … ] 의 형태로, 안에 아무것도 들어 있지 않다면 空의 리스트라고 함
- first :: rest -> 리스트 rest 앞에 요소 first를 가져다 붙인 리스트
- ex:
1 :: [] -> int list = [1]
,3 :: 2:: 1 :: [] -> int list [3; 2; 1](이는 3 :: (2 :: (1 ::[]))와 같음)
[d1; d2; ... dn]
=d1 :: d2:: ... :: dn :: []
즉, 약기법도 내부적으로는 空의 리스트와 요소를 결합한 형태
- ex:
- ‘a list: 요소의 형이 a인 리스트라는 의미
- 리스트 내 요소의 형은 서로 같아야 하며, 튜플 또는 레코드도 리스트의 요소로써 삽입할 수 있음
리스트의 템플릿(match문)
- 리스트 내부에 접근해 사용하기 위함(구조적 데이터는 모두 동일하게 match문을 사용해 내부 요소에 접근함)
-
match 식 0 with [] -> 식 1 | first :: rest -> 식 2
: 식 0을 실행해서 결과가 空의 리스트라면 식 1을, 空이 아니라면 리스트의 선두 요소 first와 그 나머지 요소 rest를 이용해 식 2를 실행 - OCaml match문의 규칙
- 식 0과 패턴은 같은 자료형일 것
- 식 1과 식 2처럼,
->
의 오른쪽은 서로 같은 자료형일 것
first :: rest
에서, rest는 first라는 요소 하나를 제외한 또 하나의 ‘리스트’- 즉 리스트란,
1. 空
2. first :: rest
둘 중 하나의 형태인데, 리스트의 정의에 rest라는 리스트가 쓰인다는 점에서 리스트의 정의에는 자기참조自己参照가 쓰이고 있다는 것을 알 수 있음
- 즉 리스트란,
예시: int 리스트를 받아, 그 안에 0이 들었는지 판별하는 함수 contain_zero의 정의
let contain_zero lst =
match lst with
[] -> false
| first :: rest
-> if first = 0 then true else false
- 만약 rest 부분에 0이 포함된다면 어떻게 탐색할 수 있는지? -> 재귀함수의 필요성
- OCaml에서 재귀함수는
let rec 함수명 파라미터 = ...
와 같이 작성하며, 이때rec
은 재귀recursion을 뜻함
let rec contain_zero lst =
match lst with
[] -> false
| first :: rest
-> if first = 0 then true else false