[PL] Ocaml : 함수형 프로그래밍 언어

parkheeddong·2023년 4월 18일
0
post-thumbnail

📌 Ocaml을 사용하면 좋은 이유?!

비함수형 언어들에서 원래 함수형 언어의 특징인 lambda 등의 표현식이 사용되고 있는 등 여러 함수형 언어들의 특징을 채택하고 있다. 대표적인 함수형 언어 Ocaml을 배워보자!

📌 Ocaml

  • 소스코드 확장자 : *.ml
  • main 함수가 없다.
  • ocaml Compiler : ocamlc
  • ocaml Build System : dune



1. Ocaml의 원시자료형

  • 원시 자료형(primitive type) 이란 = 프로그래밍 언어가 제공하는 자료형 = 내장형

1) unit

'nothing', 'empty'를 의미한다.
python의 'none'과 유사하다.

2) int

정수에 사용되는 arithmetic operator

Unary Arithmetic : -
Binary Arithmetic : +, -, *, /, mod (나머지)
Unary Bitewise : lnot
Binary Bitewise : lsl, lsr, asl, asr, land, lor, lxor

Ocaml에서 " 2 + 3.0 " 은 오류가 난다.
int + float의 조합은 오류가 난다.
+는 int 값만 더할 수 있으며, float 값은 더할 수 없다.

3) float

Float operation에는 +. -. *. /. 을 사용한다.

" 2.0 + 3.0 "은 오류가 난다.
" 2.0 +. 3.0 "은 정상적으로 출력된다.

✔️ Type Conversion Functions
int_of_float : int -> float
float_of_int : float -> int

4) char

‘a’, ‘z’, ‘1’ …

✔️ Escape sequence

5) string

"hello”, “I am string”, …

📌 Operators in string
✔️ ^: string concatenation
두 개의 string을 연결해주는 operator
e.g. “Hello ” ^ “World” => “Hello World”
✔️ .[n] : random access : 특정 인덱스에 접근
e.g. “Hello”.[1] => ‘e’ // 1번 index = e

📌 Useful library modules
✔️ String.length : string의 길이 리턴
e.g. String.length “Hello” => 5
✔️ String.sub : substring을 잘라서 리턴
๏ e.g. String.sub “Hello” 2 3 => “ll” // 2와 3만 잘라서 리턴

6) bool

✔️ true or false

📌 Comparison operators

✔️ structual equality : 두 변수에 든 내용이 같은지
a 변수 수정과 b 변수 수정은 별개인데, 둘다 값 5를 가진 경우

✔️ physical equality : 두 변수가 물리적으로 동일한 경우
a 변수를 수정할 때 b 변수도 수정된다 == 물리적 동일성

x=y : x equals y (structural equality)
x<>y : x does not equals y (structural equality)
x==y : x is identical with y (physical equality)
x!=y : x is not identical with y (physical equality)
x<y : x is less than y
x>y : x is greater than y
x<=y : x is less than or equal to y
x>=y : x is greater than or equal to y




2. Statement(구문) vs Expression(표현식)

🔔 statement와 expression의 차이

statement는 상태 전이를 일으킨다. A statement does something.

expression은 상태 전이를 일으키지는 않지만 값이 반환된다. An expression evaluates to a value.

📌 함수형 언어와 expression

✔️ 순수 함수형 언어는 오로지 expression으로만 이루어져 있으며 statement는 존재하지 않는다. 한 줄 한 줄 모두 값을 리턴하며, 상태전이를 하지 않으므로 메모리 상태를 변화시키지 않는다.
✔️ ocaml도 대부분 expression로 되어 있지만 제한된 형태로 메모리 상태를 변경하고 상태전이를 일으킬 수는 있다.

📌 Programming languages 분류

✔️ Statement-oriented(“imperative languages”): C, C++, Java, Python ..
✔️ expression-oriented(“functional language”): Haskell, Scala, Lisp




3. 정적 타입과 동적 타입 (Static Types and Dynamic Types)

📌 Statically typed languages

컴파일 시점에 Type Checking이 이뤄진다.
Type 에러는 프로그램 실행 이전에 감지된다.
➡ C, C++, Java, Scala, etc

📌 Dynamically typed languages

런타임 시점에 Type Checking이 이뤄진다.
프로그램 실행 도중에 Type Error가 발생할수 있다.
➡ Python, Javascript, Ruby, List, etc

📌 Statically typed languages 분류

✔️ Type-safe languages

런타임 상에서 Type error가 발생하지 않는다는 것을 보장한다. 모든 타입 에러가 컴파일 시점에 감지된다.
(Haskell, Scala)

✔️ Unsafe languages

Statically typed 언어라고 해도, 일부 타입 에러는 런타임 상에서 발견될 수 있다.
(C, C++)

📌 어떤 것이 나을까?!

✔️ Statically typed languages

⭕ 초기 개발 단계에서 타입 에러가 모두 걸러진다.
⭕ 런타임 상에서의 체킹이 생략되므로 프로그램 실행이 효율적이다.
❌ 다이나믹언어보다 덜 flexible 해진다.

✔️ Dynamically typed languages:

⭕ 빠른 프로토타입과 개발
⭕ 더 flexible한 특징을 가진다.
❌ Type error가 런타임에서 발견된다.




0개의 댓글