Search

러스트에서 모나드 사용해보기

Rust에서는 일반적으로 Haskell과 같은 함수형 프로그래밍 언어와는 다른 방식으로 모나드를 구현합니다. Rust는 모나드를 직접 지원하지 않기 때문에 일반적으로 Option, Result 등의 타입을 사용하여 모나드 스타일의 코드를 작성합니다.
이를 예를 들어 설명하면, Option 모나드는 값이 있을 수도, 없을 수도 있는 값을 나타내는 타입입니다. 이 모나드를 이용하여 코드를 작성하면 다음과 같습니다.
fn add_one(x: Option<i32>) -> Option<i32> { x.and_then(|n| Some(n + 1)) } fn main() { let x = Some(1); let y = None; println!("{:?}", add_one(x)); // Some(2) println!("{:?}", add_one(y)); // None }
Rust
복사
위 코드에서 add_one 함수는 Option<i32> 타입의 값을 받아서 1을 더한 다음, 그 결과를 다시 Option<i32> 타입으로 반환합니다. and_then 함수는 Option의 값을 꺼내서 함수를 실행하고, 그 결과를 다시 Option으로 반환합니다. 만약 값이 None이라면, and_then 함수는 None을 반환합니다.
Result 모나드의 경우, 에러가 발생할 수 있는 값을 처리할 때 사용됩니다. 예를 들어, 파일을 열 때 파일이 존재하지 않는 경우 에러를 처리하는 코드를 작성하면 다음과 같습니다.
use std::fs::File; use std::io::ErrorKind; fn open_file(path: &str) -> Result<File, String> { match File::open(path) { Ok(file) => Ok(file), Err(e) => { match e.kind() { ErrorKind::NotFound => Err("File not found".to_string()), _ => Err("Failed to open file".to_string()), } } } } fn main() { let path = "test.txt"; match open_file(path) { Ok(file) => println!("Opened file: {:?}", file), Err(e) => println!("{}", e), } }
Rust
복사
위 코드에서 open_file 함수는 파일을 열 때 에러가 발생할 수 있으므로, Result<File, String> 타입을 반환합니다. 만약 파일이 존재하지 않는다면, "File not found" 메시지를 반환하고, 그 외의 에러는 "Failed to open file" 메시지를 반환합니다. main 함수에서는 open_file 함수가 반환한 결과를 match 표현식으로 처리합니다. 파일이 성공적으로 열린 경우에는 파일 객체를 출력하고, 그렇지 않은 경우에는 에러 메시지를 출력합니다.

컬렉션 찾아보기

시리즈