Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

FunLang 튜토리얼

어서오세요

이 튜토리얼에 오신 것을 환영합니다.

FunLang는 함수형 프로그래밍의 핵심 아이디어들을 작고 명확한 언어로 담아낸 ML 계열 언어입니다. F#의 들여쓰기 기반 문법, OCaml의 타입 시스템과 연산자 분류 체계, Haskell의 순수 함수적 사고방식에서 영감을 받아 설계되었습니다. 거대한 표준 라이브러리나 복잡한 도구 체인 없이도 함수형 언어의 본질적인 아름다움을 경험할 수 있도록 만들어졌습니다.

이 튜토리얼은 파이썬, 자바스크립트, Java 등의 언어를 어느 정도 다뤄봤고, 함수형 프로그래밍에 진지하게 입문하고 싶은 분들을 위해 썼습니다. OCaml이나 F#을 이미 알고 있다면 1~4장은 빠르게 훑고 지나갈 수 있을 것이고, Haskell 배경이 있다면 타입 시스템 부분에서 친숙한 개념을 많이 만나게 될 것입니다.

완전한 초보자분도 환영합니다. 다만 “재귀가 무엇인가“부터 시작하지는 않습니다. 그 기초는 독자분이 이미 가지고 있다고 가정합니다.

FunLang는 어떤 언어인가

한 문장으로 요약하자면: F# 스타일의 들여쓰기 기반 문법, ADT/GADT/Records 타입 시스템, Haskell 스타일 타입 클래스, 모듈, 예외 처리, 파이프 연산자, 문자열 내장 함수를 갖춘 ML 계열 함수형 프로그래밍 언어입니다.

좀 더 풀어서 이야기하면, FunLang는 다음 세 가지를 잘 합니다.

첫째, 타입으로 생각하기입니다. FunLang의 타입 시스템은 단순한 오류 방지 도구가 아닙니다. 대수적 데이터 타입(ADT)과 GADT를 통해 여러분이 다루는 문제의 구조를 코드로 직접 표현할 수 있습니다. “이 함수는 실패할 수 있다“는 사실을 Option이나 Result 타입으로 명시하고, 컴파일러가 모든 경우를 처리했는지 확인해줍니다.

둘째, 파이프라인으로 생각하기입니다. |> 연산자와 함수 합성은 데이터 변환 과정을 왼쪽에서 오른쪽으로 읽히는 자연스러운 흐름으로 표현합니다. 중첩된 함수 호출 대신 단계별 변환의 연쇄로 프로그램을 구성하는 방식을 익히게 됩니다.

셋째, 패턴으로 생각하기입니다. 패턴 매칭은 단순한 switch문의 대체품이 아닙니다. 복잡한 데이터 구조를 분해하고, 타입에 따라 분기하고, 불가능한 케이스를 컴파일 시점에 제거하는 강력한 도구입니다.

튜토리얼의 구성

이 튜토리얼은 네 단계로 나뉩니다. 각 단계는 이전 단계 위에 쌓아올려집니다.

시작하기

1장: 시작하기부터 시작하세요.

목차

기초

기초 단계에서는 FunLang가 어떻게 동작하는지 손으로 느껴봅니다. 특히 2장의 함수와 4장의 패턴 매칭은 이후 모든 장의 토대가 됩니다. 서두르지 말고 코드를 직접 실행해보며 감을 익히세요.

타입 시스템

타입 시스템 단계는 FunLang의 심장입니다. 5장에서 ADT를 이해하는 순간 함수형 프로그래밍의 핵심 설계 방식이 보이기 시작합니다. “데이터의 모양을 타입으로 표현한다“는 발상은 처음에는 낯설 수 있지만, 한번 익숙해지면 다른 방식으로 돌아가기 어렵습니다.

실용 프로그래밍

실용 프로그래밍 단계에서는 실제로 유용한 프로그램을 작성하는 방법을 익힙니다. 8장의 파이프 연산자는 FunLang 코드를 “FunLang답게” 만드는 핵심입니다. 9장의 Prelude는 매일 쓰게 될 도구들의 모음입니다.

에러 처리

에러 처리 단계에서는 실패를 어떻게 다룰 것인가라는 질문을 깊이 파고듭니다. 단순히 “예외를 던지고 잡는 방법“을 넘어서, 언제 예외를 쓰고 언제 Option을 쓰고 언제 Result를 써야 하는지 설계적 판단력을 기릅니다.

심화 주제

심화 주제 단계는 FunLang의 더 강력한 도구들을 다룹니다. 13장의 사용자 정의 연산자는 코드를 도메인 언어처럼 읽히게 만드는 기술이고, 14장의 GADT는 타입 시스템으로 표현할 수 있는 것들의 한계를 크게 넓혀줍니다. 23장의 타입 클래스는 Haskell에서 영감을 받은 다형성 메커니즘으로, 타입에 따라 동작이 달라지는 함수를 타입 안전하게 정의할 수 있게 합니다. 15장은 앞서 배운 모든 것을 실제 알고리즘 문제에 적용하는 종합 실습입니다.

부록

튜토리얼을 따라가는 방법

코드를 눈으로만 읽지 마세요. 모든 예제를 직접 실행해보고, 값을 바꿔서 어떻게 되는지 실험해보세요. “이렇게 하면 어떻게 될까?” 하는 질문이 생기면 바로 시도해보세요. 컴파일러의 에러 메시지는 적이 아닙니다. 무엇이 잘못되었는지 알려주는 가장 정직한 선생님입니다.

각 장의 예제들은 독립적으로 실행할 수 있습니다. 특정 개념이 궁금하면 해당 장으로 바로 건너뛰어도 됩니다. 다만 이전 장에서 소개된 개념은 이후 장에서 설명 없이 사용되므로, 처음 읽을 때는 순서대로 따라오는 것을 권장합니다.

막히는 부분이 있다면 그 장을 처음부터 다시 읽어보세요. 두 번째 읽을 때 처음에 놓쳤던 것이 보이는 경우가 많습니다. 프로그래밍 언어의 새로운 개념들은 종종 한번에 이해되지 않고, 여러 번 마주치면서 점점 깊어지는 방식으로 익혀집니다.

자, 시작해봅시다.