Skip to content
Playground

std::data::result

result 'ok 'err は、失敗しうる計算の値表現である。 エラー effect を値に閉じて、保持・返却・パターンマッチしたいときに使う。

yulang
pub enum result 'ok 'err:
    ok 'ok
    err 'err

prelude が 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 fok 値に f を当て、err はそのまま
r.and_then fok 値で f を走らせる(f が再び result を返す)
r.unwrap_or fallbackok 値を取る、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.show

E::wrap は thunk を走らせ、対応するエラー effect を捕まえて result 'ok E を返す。 effect ベースのエラーと値表現の標準的なブリッジ。

from で集約したエラーでは、wrap がリンクされた narrower エラーも同時に捕まえる。 詳細は エラー を参照。

早見表

操作シグネチャ
ok(x)'a -> result 'a 'err
err(e)'err -> result 'ok 'err
r.map fresult 'a 'err -> ('a -> 'b) -> result 'b 'err
r.and_then fresult 'a 'err -> ('a -> result 'b 'err) -> result 'b 'err
r.unwrap_or fallbackresult 'a 'err -> 'a -> 'a

関連ページ

  • エラーerror E: と catch-by-name
  • std::data::opt:エラー側が情報を持たないとき
  • cast:result 風 wrapper との変換

Yulang