ecole42

ocaml-piscine

ocaml-piscine은 ecole42의 OCaml 교육 과정으로, 9개 모듈을 통해 OCaml 언어의 기초부터 고급 개념까지 체계적으로 학습하는 프로젝트. 재귀, 고차 함수, 타입 시스템, 변형체, 모듈, 객체 지향 프로그래밍, 모노이드, 모나드 등 함수형 프로그래밍의 핵심 개념을 실습 문제를 통해 익힌다. 각 모듈은 독립적으로 빌드하고 실행할 수 있으며, Vagrant를 통한 개발 환경 설정을 제공한다

OCaml
Functional Programming

개요

이 프로젝트는 OCaml 언어의 기초부터 고급 개념까지 체계적으로 학습할 수 있도록 구성된 실습 자료다. 각 모듈은 특정 주제에 집중하며, 실습 문제를 통해 개념을 이해하고 적용할 수 있다.

환경 설정

Vagrant를 사용한 개발 환경 설정

프로젝트에는 Vagrant를 사용한 개발 환경 설정이 포함되어 있다.

# VM 시작
vagrant up

# VM 접속
vagrant ssh

# VM 종료 및 삭제
vagrant destroy

Vagrantfile은 Ubuntu 22.04 LTS를 기반으로 하며, 다음을 자동으로 설치:

  • OCaml 컴파일러
  • OPAM (OCaml Package Manager)
  • OCaml 4.14.0

수동 설치

Vagrant를 사용하지 않는 경우, 다음 명령어로 OCaml을 설치할 수 있다:

# Ubuntu/Debian
sudo apt-get install ocaml opam

# macOS (Homebrew)
brew install ocaml opam

# OPAM 초기화
opam init
eval $(opam env)

프로젝트 구조

ocaml-piscine/
├── module00/          # 기초 함수 및 제어 구조
├── module01/          # 재귀 및 고차 함수
├── module02/          # 리스트 및 시퀀스
├── module03/          # 타입 및 변형체
├── module04/          # 참조, 예외, 파일 I/O
├── module05/          # 스크립트 및 모듈
├── module06/          # 객체 지향 프로그래밍
├── module07/          # 복잡한 타입 시스템 (화학 분자 모델링)
├── module08/          # 고급 개념 (모듈, 모노이드, 모나드)
└── Vagrantfile        # 개발 환경 설정

각 연습 문제는 다음 구조를 따릅니다:

exXX/
├── [function_name].ml    # 구현 파일
├── main.ml              # 테스트 파일
└── Makefile             # 빌드 설정

모듈별 설명

Module 00: 기초 함수 및 제어 구조

기본적인 함수 작성과 제어 구조를 학습한다.

  • ex00: ft_test_sign - 숫자의 부호 판별
  • ex01: ft_countdown - 카운트다운 함수
  • ex02: ft_power - 거듭제곱 계산
  • ex03: ft_print_alphabet - 알파벳 출력
  • ex04: ft_print_comb - 조합 출력
  • ex05: ft_print_rev - 문자열 역순 출력
  • ex06: ft_string_all - 문자열 검증
  • ex07: ft_is_palindrome - 회문 판별
  • ex08: ft_rot_n - ROT-N 암호화
  • ex09: ft_print_comb2 - 두 자리 조합 출력

Module 01: 재귀 및 고차 함수

재귀 함수와 고차 함수의 개념을 학습한다.

  • ex00: repeat_x - 문자열 반복
  • ex01: repeat_string - 문자열 반복 (고차 함수)
  • ex02: ackermann - 아커만 함수 (비원시 재귀 함수)
  • ex03: tak - Takeuchi 함수
  • ex04: fibonacci - 피보나치 수열
  • ex05: hofstadter_mf - 호프스태터 함수
  • ex06: iter - 반복 함수
  • ex07: converges - 수렴 함수
  • ex08: ft_sum - 합계 계산
  • ex09: leibniz_pi - 라이프니츠 파이 공식

Module 02: 리스트 및 시퀀스

리스트 조작과 시퀀스 처리에 대해 학습한다.

  • ex00: encode - 인코딩 함수
  • ex01: crossover - 교차 함수
  • ex02: gray - 그레이 코드
  • ex03: sequence - 시퀀스 생성
  • ex04: nucleotides - 뉴클레오티드 처리
  • ex05: helix - 나선 구조
  • ex06: rna - RNA 처리

Module 03: 타입 및 변형체

OCaml의 타입 시스템과 변형체(variant types)를 학습한다.

  • ex00: Color - 카드 색상 타입 (Spade, Heart, Diamond, Club)
  • ex01: Value - 카드 값 타입
  • ex02: Card - 카드 타입 조합

Module 04: 참조, 예외, 파일 I/O

변경 가능한 상태, 예외 처리, 파일 입출력을 학습한다.

  • ex00: micronap - 마이크로 슬립
  • ex01: ft_ref - 참조 타입 사용
  • ex02: jokes - 예외 처리
  • ex03: jokes - 파일에서 읽기
  • ex04: sum - 파일 처리
  • ex05: eu_dist - 유클리드 거리 계산
  • ex06: example_of_file - CSV 파일 처리

Module 05: 스크립트 및 모듈

OCaml 스크립트 작성과 모듈 시스템을 학습한다.

  • ex00: StringSet - Set 모듈 사용
  • ex01-ex04: 다양한 모듈 및 스크립트 예제

Module 06: 객체 지향 프로그래밍

OCaml의 객체 지향 프로그래밍 기능을 학습한다.

  • ex00: people - 기본 클래스
  • ex01: doctor - 클래스 상속
  • ex02: dalek - 다중 클래스 상속

Module 07: 복잡한 타입 시스템

화학 분자 모델링을 통한 복잡한 타입 시스템을 학습한다.

  • ex00: atom - 원자 클래스 (Hydrogen, Carbon, Oxygen 등)
  • ex01: molecule - 분자 클래스
  • ex02: alkane - 알칸 분자
  • ex03: reaction - 화학 반응
  • ex04: alkane_combustion - 알칸 연소 반응
  • ex05: 고급 반응 처리

Module 08: 고급 개념

모듈, 모노이드, 모나드 등 고급 함수형 프로그래밍 개념을 학습한다.

  • ex00: Watchtower - 모듈 (시계 모노이드)
  • ex01: App - 애플리케이션 모듈
  • ex02: Monoid - 모노이드 구현
  • ex03: Monad - 모나드 구현
  • ex04: 고급 모나드 패턴

빌드 및 실행

각 연습 문제는 독립적으로 빌드하고 실행할 수 있다.

빌드

cd moduleXX/exYY
make

실행

./run.out

정리

make clean    # 빌드 산출물 삭제
make re       # 정리 후 재빌드

예제

# Module 00의 첫 번째 연습 문제 실행
cd module00/ex00
make
./run.out

학습 순서

  1. Module 00: OCaml의 기본 문법과 함수 작성법을 익힌다.
  2. Module 01: 재귀와 고차 함수를 통해 함수형 프로그래밍의 핵심을 학습한다.
  3. Module 02: 리스트와 시퀀스를 다루는 방법을 학습한다.
  4. Module 03: OCaml의 강력한 타입 시스템을 이해한다.
  5. Module 04: 변경 가능한 상태와 예외 처리, 파일 I/O를 학습한다.
  6. Module 05: 모듈 시스템과 스크립트 작성법을 학습한다.
  7. Module 06: OCaml의 객체 지향 프로그래밍 기능을 학습한다.
  8. Module 07: 복잡한 타입 시스템을 실제 문제에 적용한다.
  9. Module 08: 함수형 프로그래밍의 고급 개념을 학습한다.

참고 자료