모듈: 코드를 정리하는 상자.
Math.add 3 5처럼 모듈 이름을 통해 함수나 값을 사용.모듈 타입: 모듈의 메뉴판.
추상 타입: 내부 구조를 숨기는 상자.
type t로 내부를 감추고, 정해진 함수만 사용하게 강제.펑터: 모듈을 받아 새로운 모듈을 만드는 함수.
Set.Make(String)처럼 키 타입을 지정해 집합이나 맵 생성.모듈은 OCaml에서 코드와 데이터를 묶는 "상자"입니다. 파일 단위로 분리하거나 코드를 조직적으로 관리할 때 사용합니다.
module Math = struct
let add x y = x + y
let square x = x * x
end
(* 사용법 *)
let result = Math.add 3 5 (* result = 8 *)
let square_result = Math.square 4 (* square_result = 16 *)
모듈의 인터페이스를 정의합니다. 모듈 타입은 어떤 함수와 값을 외부에 공개할지 결정합니다.
module type MathSig = sig
val add : int -> int -> int
val square : int -> int
end
module Math : MathSig = struct
let add x y = x + y
let square x = x * x
end
Math는 MathSig라는 모듈 타입에 맞춰 작성된 모듈입니다.모듈 타입에서 구체적인 타입 구현을 숨기는 방식입니다. 사용자에게 타입이 어떤 구조인지 감추고, 제공된 함수만 사용하도록 강제합니다.
module type CounterSig = sig
type t
val create : unit -> t
val increment : t -> t
val value : t -> int
end
module Counter : CounterSig = struct
type t = int
let create () = 0
let increment x = x + 1
let value x = x
end
CounterSig는 t 타입의 내부 구조를 감춥니다. 외부에서는 Counter.create와 같은 함수만 사용 가능합니다.펑터는 모듈을 입력으로 받아 새로운 모듈을 생성하는 함수입니다. 예를 들어, Map.Make는 특정 키 타입을 입력으로 받아 Map 모듈을 생성하는 펑터입니다.
module StringSet = Set.Make(String)
(* StringSet 사용 *)
let my_set = StringSet.empty
let my_set = StringSet.add "hello" my_set
let is_member = StringSet.mem "hello" my_set (* true *)
Set.Make는 문자열(String)을 키로 사용하는 집합을 생성합니다.—
이 문장은 OCaml에서 함수형 프로그래밍(Functional Programming)에만 집중하도록 요구하고 있으며, 명령형(imperative) 또는 객체지향(object-oriented) 프로그래밍 기법을 사용하지 말라는 의미입니다. 참조 타입이나 가변 데이터 구조, 그리고 for나 while 같은 반복문을 사용하지 않고 함수와 불변(immutable) 데이터 구조를 통해 문제를 해결하라는 지침입니다.
함수형 프로그래밍에서는 이러한 특성들을 통해 프로그램의 상태 변화를 최소화하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.
명령형 프로그래밍은 코드가 변경되는 과정을 따라가야 하므로, 코드의 흐름이 복잡해질 수 있습니다.