goosegoose.DRAM
article thumbnail

리스트(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]을 반환한다.

리스트 원소 추가
리스트 연결하기

 

 

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

Zero타입은 x에, Integer 타입의 3은 y에 Float 타입의 3.0은 z에 바인딩된다.

 

 

Pettern matching for disjoint union

합집합의 경우 패턴매칭 Constructor를 통해 수행된다.

 

profile

goosegoose.DRAM

@goosesong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!