RUST · 심층 가이드
Rust 함수형 완전 정리
순수 함수와 불변 업데이트에서 출발해 fold, compose, 커링, 게으른 이터레이터까지 Rust에서 함수형 스타일을 쓰는 15가지 방법을 다룹니다.
Rust의 클로저는 하나가 아니라 Fn, FnMut, FnOnce 세 트레이트로 갈립니다. 캡처한 값을 읽기만 하는지, 바꾸는지, 통째로 가져가는지에 따라 컴파일러가 알아서 등급을 정합니다. 함수형 언어처럼 클로저를 자유롭게 주고받으려다 막히는 지점은 대개 문법이 아니라 이 등급과 소유권이 맞지 않아서입니다.
순수 함수와 불변 업데이트로 기준을 잡은 뒤 fold 합계를 보면 반복문을 값의 축적으로 바꾸는 감각이 잡힙니다. 그 위에 compose와 partial 적용, curried 함수가 얹히는데, Rust에서는 이 세 가지가 다른 언어만큼 매끄럽지 않습니다. 클로저를 반환하려면 impl Fn(...)이나 Box<dyn Fn(...)>로 타입을 밝혀야 하기 때문입니다. 함수 값을 반환하는 함수 항목에서 이 형태를 직접 확인하십시오.
가장 자주 만나는 함정은 move 클로저입니다. 캡처한 값을 클로저 안으로 옮기면 바깥에서는 더 이상 그 값을 쓸 수 없고, 반대로 move를 빼면 참조를 캡처해 클로저가 원본보다 오래 살 수 없게 됩니다. 클로저를 반환하거나 스레드로 넘길 때는 거의 항상 move가 필요하고, 그 대신 캡처할 값을 미리 복제해 두는 판단이 따라옵니다.
01순수 함수
Rust에서 순수 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// 순수 함수
fn main() {
let values = [1, 2, 3, 1];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
02불변 업데이트
Rust에서 불변 업데이트 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// 불변 업데이트
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(20.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
03Maybe 스타일 처리
Rust에서 Maybe 스타일 처리 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// Maybe 스타일 처리
fn main() {
let values = [1, 2, 3, 3];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
04Result 스타일 매핑
Rust에서 Result 스타일 매핑 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// Result 스타일 매핑
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(40.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
05fold 합계
Rust에서 fold 합계 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// fold 합계
fn main() {
let values = [1, 2, 3, 5];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
06compose
Rust에서 compose 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// compose
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(60.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
07partial 적용
Rust에서 partial 적용 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// partial 적용
fn main() {
let values = [1, 2, 3, 7];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
08curried 함수
Rust에서 curried 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// curried 함수
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(80.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
09pipeline
Rust에서 pipeline 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// pipeline
fn main() {
let values = [1, 2, 3, 9];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
10lazy iterator
Rust에서 lazy iterator 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// lazy iterator
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(100.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
11패턴 분기
Rust에서 패턴 분기 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// 패턴 분기
fn main() {
let values = [1, 2, 3, 11];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
12reducer 상태 누적
Rust에서 reducer 상태 누적 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// reducer 상태 누적
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(120.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
13all predicate
Rust에서 all predicate 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// all predicate
fn main() {
let values = [1, 2, 3, 13];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
14flatMap
Rust에서 flatMap 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// flatMap
fn main() {
let add_tax = |price: f64| price * 1.1;
println!("{}", add_tax(140.0));
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
15함수 값을 반환하는 함수
Rust에서 함수 값을 반환하는 함수 개념을 코드로 빠르게 확인하는 함수형 예제입니다.
Rust code
// 함수 값을 반환하는 함수
fn main() {
let values = [1, 2, 3, 15];
let total: i32 = values.iter().sum();
println!("{}", total);
}함수형 예제는 입력과 출력이 분명할수록 재사용과 테스트가 쉬워진다는 점이 핵심입니다.
원본 데이터를 직접 바꾸기 시작하면 함수형 스타일의 장점이 크게 줄어듭니다.
정리하며
- 클로저는 캡처 방식에 따라 Fn·FnMut·FnOnce로 나뉘며 이것이 제약의 출발점입니다
- 클로저를 반환하려면 impl Fn 또는 Box dyn Fn으로 타입을 밝혀야 합니다
- move는 소유권을 옮기므로 바깥에서 쓸 값은 미리 복제해 둡니다
- fold는 반복문을 값의 축적으로 바꾸는 가장 기본적인 도구입니다
더 깊이 들어가고 싶다면 Rust 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.