std::data::result
result 'ok 'err は、失敗しうる計算の値表現である。 エラー effect を値に閉じて、保持・返却・パターンマッチしたいときに使う。
yulang
pub enum result 'ok 'err:
ok 'ok
err 'errprelude が result / ok / err を re-export している。
構築
yulang
ok 1
ok "yes"
err "missing config"
err (io_err::not_found (std::text::path::of_bytes: to_bytes "p"))パターンマッチ
yulang
my maybe_n = ok 41
case maybe_n:
ok n -> n + 1
err e -> 0コンビネータ
yulang
my doubled = (ok 21).map (\x -> x * 2) // ok 42
(ok 1).and_then (\x -> ok (x + 1)) // ok 2
(ok 1).and_then (\_ -> err "stop") // err "stop"
(err "stop").and_then (\x -> ok x) // err "stop"
(ok 1).unwrap_or 0 // 1
(err "boom").unwrap_or 0 // 0| ヘルパー | 振る舞い |
|---|---|
r.map f | ok 値に f を当て、err はそのまま |
r.and_then f | ok 値で f を走らせる(f が再び result を返す) |
r.unwrap_or fallback | ok 値を取る、err なら fallback |
error E: と wrap との関係
yulang
error parse_err:
invalid str
my parse(source: str): str = fail (parse_err::invalid source)
my wrapped: result str parse_err = parse_err::wrap: parse "?"
case wrapped:
ok text -> text
err e -> e.showE::wrap は thunk を走らせ、対応するエラー effect を捕まえて result 'ok E を返す。 effect ベースのエラーと値表現の標準的なブリッジ。
from で集約したエラーでは、wrap がリンクされた narrower エラーも同時に捕まえる。 詳細は エラー を参照。
早見表
| 操作 | シグネチャ |
|---|---|
ok(x) | 'a -> result 'a 'err |
err(e) | 'err -> result 'ok 'err |
r.map f | result 'a 'err -> ('a -> 'b) -> result 'b 'err |
r.and_then f | result 'a 'err -> ('a -> result 'b 'err) -> result 'b 'err |
r.unwrap_or fallback | result 'a 'err -> 'a -> 'a |
関連ページ
- エラー:
error E:と catch-by-name std::data::opt:エラー側が情報を持たないとき- cast:result 風 wrapper との変換