generated at
RustのResult<T, E>型

rs
enum Result<T, E> { Ok(T), Err(E), }




GPT-4
is_ok / is_err
Result Ok Err かを判定する。
類似: isRight / isLeft (Haskell, Either 型)

rust
let x: Result<i32, &str> = Ok(10); assert!(x.is_ok()); let y: Result<i32, &str> = Err("error"); assert!(y.is_err());

Haskell:
haskell
isRight :: Either a b -> Bool isLeft :: Either a b -> Bool


---

ok / err
Ok(T) の場合は Some(T) , Err(E) の場合は None を返す。

rust
let x: Result<i32, &str> = Ok(10); assert_eq!(x.ok(), Some(10)); let y: Result<i32, &str> = Err("error"); assert_eq!(y.err(), Some("error"));


Haskell:
haskell
rightToMaybe :: Either a b -> Maybe b leftToMaybe :: Either a b -> Maybe a

---

map
rust
let x: Result<i32, &str> = Ok(10); let y = x.map(|v| v * 2); assert_eq!(y, Ok(20));

map_err
rust
let x: Result<i32, &str> = Err("error"); let y = x.map_err(|e| format!("wrapped: {}", e)); assert_eq!(y, Err(String::from("wrapped: error")));

and_then
Ok(T) の場合、関数を適用して Result<U, E> を返す (flatMap)
rust
let x: Result<i32, &str> = Ok(10); let y = x.and_then(|v| if v > 5 { Ok(v * 2) } else { Err("too small") }); assert_eq!(y, Ok(20));

or_else
rust
let x: Result<i32, &str> = Err("error"); let y = x.or_else(|_| Ok(0)); assert_eq!(y, Ok(0));

unwrap / expect
Ok(T) の場合は T を返す。 Err(E) の場合は panic。

rust
let x: Result<i32, &str> = Ok(10); assert_eq!(x.unwrap(), 10); let y: Result<i32, &str> = Err("error"); // y.unwrap(); // panic!

unwrap_or
Ok(T) の場合は T Err(E) の場合はデフォルト値を返す。

rust
let x: Result<i32, &str> = Err("error"); assert_eq!(x.unwrap_or(42), 42);


Haskell:
haskell
fromRight :: a -> Either b a -> a


---

unwrap_or_else
Ok(T) の場合は T Err(E) の場合は関数適用した値を返す。

rust
let x: Result<i32, &str> = Err("error"); let y = x.unwrap_or_else(|_| 42); assert_eq!(y, 42);


Haskell:
haskell
fromRight' :: (e -> a) -> Either e a -> a


---

transpose
Result<Option<T>, E> Option<Result<T, E>> に変換する。
具体的なsequenceAみたいな
rust
let x: Result<Option<i32>, &str> = Ok(Some(10)); assert_eq!(x.transpose(), Some(Ok(10))); let y: Result<Option<i32>, &str> = Ok(None); assert_eq!(y.transpose(), None);

iter
Ok(T) の場合 T をイテレートする。

rust
let x: Result<i32, &str> = Ok(10); for v in x.iter() { println!("{}", v); // 10 }

Haskell:
haskell
maybeToList :: Maybe a -> [a]


---

ok_or
Option<T> Result<T, E> に変換する。

rust
let x: Option<i32> = Some(10); assert_eq!(x.ok_or("error"), Ok(10)); let y: Option<i32> = None; assert_eq!(y.ok_or("error"), Err("error"));
Haskell:
haskell
maybeToEither :: e -> Maybe a -> Either e a


---

ok_or_else
Option<T> Result<T, E> に変換するが、 Err の値を関数で生成する。

rust
let x: Option<i32> = None; let y = x.ok_or_else(|| "generated error"); assert_eq!(y, Err("generated error"));


Haskell:
haskell
maybeToEither' :: (a -> e) -> Maybe a -> Either e a