[함수형언어] 1주차 수업 내용 정리
04.10 1주차 수업 내용 정리
입력과 출력
- OCaml 인터프리터에
3
이라고 입력 후;
을 연속으로 2개 입력한 뒤, 엔터를 입력해 보자. 이것만으로도 훌륭한 프로그램이다. - 위 입력의 결과는
- : int = 3
이라고 출력된다. ‘직전 값의 결과는 int 자료형으로, 값은 3이다’라는 의미이다. 이처럼 OCaml은 결과를 출력할 때 그 자료형도 항상 함께 출력한다. - OCaml에서는 컴파일러 사용 없이 바로 실행 후 결과를 확인한다.
정수형 int, 실수형 float
- 소수점이 있는 숫자는 실수 자료형 float이다.
- OCaml은 정수와 실수를 엄격하게 구분하고 있으며, 사칙연산에 쓰이는 연산자도 다르다. 아래의 연산자를 제외한 괄호 등의 사용법은 동일하다.
3.14 + 5 ;;
와 같이 정수와 실수를 혼용할 경우 에러가 발생한다. ’해당 표현식은 실수 자료형이나, 연산자는 자료형을 정수형으로 예상함’이라는 내용의 에러 메시지가 출력된다.
연산 종류 | 정수 | 실수 |
---|---|---|
덧셈 | + | +. |
뺄셈 | - | -. |
곱셈 | * | *. |
나눗셈 | / | /. |
나머지 | mod | |
거듭제곱 | ** |
문자열 string
- 문자열은
"
, 쌍따옴표로 묶는다. - 두 개의 문자열을 하나로 붙일 때는
^
연산자를 사용한다.예시: "Hello " ^ "World!"
진위값 bool
true
,false
둘 중 하나의 값을 나타낸다.- 조건 분기를 배울 때 자세히 다룰 예정.
변수의 정의
let 변수 = 식
의 형태로 변수를 정의한다. 식의 실행 결과에 변수의 이름을 붙이는 것이다.
# let pi = 3.1415 ;;
val pi : float = 3.1415
(* pi라는 값이 정의되었으며, 그 자료형은 실수형이고 값은 3.1415이다. *)
(* 변수 정의 이후, 3.1415 대신 pi를 사용하는 것이 가능 *)
# pi *. 2. ;;
- : float = 6.283
- OCaml의 변수명은 무조건 알파벳 소문자로 시작해야 한다. 두 번째 글자부터는 대문자, 소문자, 숫자 등을 자유롭게 사용하는 것이 가능하다.
- OCaml에서의 변수란, C 등의 절차적 언어에서의 상수(const, 일본어로 定数)와 비슷하다. 즉 한 번 선언하면 변수의 값을 변경하는 것이 불가능하다.
- 값의 변경이 불가능하다면 프로그램을 작성하는 것이 어렵다고 생각할 수 있으나, 프로그램의 신뢰성은 매우 높아진다.
함수의 정의
let 함수 파라미터 ... = 식
의 형태로 변수를 정의한다. 식의 실행 결과에 변수의 이름을 붙이는 것이다. 파라미터에 괄호나 쉼표는 사용하지 않는다.
# let square x = x *. x ;;
val square : float -> float = <fun>
(* float 자료형의 파라미터 -> float 자료형의 값을 도출하는 함수 *)
# square pi ;;
- : float = 9.86902225
(* 파라미터가 2개인 함수 *)
# let kyori x y = sqrt (square x +. square y) ;;
val kyori : float -> float -> float = <fun>
(* float 자료형의 파라미터 -> float 자료형의 파라미터 -> float 자료형의 값을 도출하는 함수 *)
# kyori 3.0 4.0 ;;
- : float = 5.
- OCaml에서 함수의 자료형은, 파라미터로 받은 자료형과 결과로써 도출하는 값의 자료형 양쪽을 지정한다. 위 코드에서
square
함수가 파라미터로 상수형을 받는 것은, 연산자가*.
이기 때문. - OCaml은 프로그램에서 실행되는 명령을 보고, 그로부터 함수의 자료형을 자동적으로 추론한다. 만일
square
함수에 상수형이 아닌 다른 자료형의 값이 파라미터로 주어진다면 에러를 일으킨다. - 함수
kyori
역시 OCaml이 자동적으로 자료형을 추론하고 있다.
자료형 추론
- 코드를 작성할 때 자료형을 명시하지 않아도, 자동으로 형을 추론한다.
자료형 체크
- OCaml은 프로그램 실행 전에, 자료형이 일치하는지 확인한다. 따라서 실행 시 자료형 에러가 발생하지 않음을 이론적으로 보장한다.