package spin

  1. Overview
  2. Docs
include module type of struct include Base.Result end
type ('ok, 'err) t = ('ok, 'err) result =
  1. | Ok of 'ok
  2. | Error of 'err

'ok is the return type, and 'err is often an error message string.

type nat = Zero | Succ of nat

let pred = function
  | Succ n -> Ok n
  | Zero -> Error "Zero does not have a predecessor"

The return type of pred could be nat option, but (nat, string) Result.t gives more control over the error message.

include Sexplib0.Sexpable.S2 with type ('ok, 'err) t := ('ok, 'err) t
val t_of_sexp : (Sexplib0.Sexp.t -> 'a) -> (Sexplib0.Sexp.t -> 'b) -> Sexplib0.Sexp.t -> ('a, 'b) t
val sexp_of_t : ('a -> Sexplib0.Sexp.t) -> ('b -> Sexplib0.Sexp.t) -> ('a, 'b) t -> Sexplib0.Sexp.t
val t_sexp_grammar : 'ok Sexplib0.Sexp_grammar.t -> 'err Sexplib0.Sexp_grammar.t -> ('ok, 'err) t Sexplib0.Sexp_grammar.t
val compare : ('a -> 'a -> int) -> ('b -> 'b -> int) -> ('a, 'b) t -> ('a, 'b) t -> int
val equal : ('a -> 'a -> bool) -> ('b -> 'b -> bool) -> ('a, 'b) t -> ('a, 'b) t -> bool
val hash_fold_t : (Base.Hash.state -> 'a -> Base.Hash.state) -> (Base.Hash.state -> 'b -> Base.Hash.state) -> Base.Hash.state -> ('a, 'b) t -> Base.Hash.state
include Base.Monad.S2 with type ('a, 'err) t := ('a, 'err) t
val (>>=) : ('a, 'e) t -> ('a -> ('b, 'e) t) -> ('b, 'e) t
val (>>|) : ('a, 'e) t -> ('a -> 'b) -> ('b, 'e) t
module Monad_infix = Base.Result.Monad_infix
val bind : ('a, 'e) t -> f:('a -> ('b, 'e) t) -> ('b, 'e) t
val return : 'a -> ('a, _) t
val join : (('a, 'e) t, 'e) t -> ('a, 'e) t
val ignore_m : (_, 'e) t -> (unit, 'e) t
val all : ('a, 'e) t list -> ('a list, 'e) t
val all_unit : (unit, 'e) t list -> (unit, 'e) t
module Error = Base.Result.Error
val invariant : ('a -> unit) -> ('b -> unit) -> ('a, 'b) t -> unit
val fail : 'err -> (_, 'err) t
val failf : ('a, unit, string, (_, string) t) format4 -> 'a

e.g., failf "Couldn't find bloogle %s" (Bloogle.to_string b).

val is_ok : (_, _) t -> bool
val is_error : (_, _) t -> bool
val ok : ('ok, _) t -> 'ok option
val ok_exn : ('ok, exn) t -> 'ok
val ok_or_failwith : ('ok, string) t -> 'ok
val error : (_, 'err) t -> 'err option
val of_option : 'ok option -> error:'err -> ('ok, 'err) t
val iter : ('ok, _) t -> f:('ok -> unit) -> unit
val iter_error : (_, 'err) t -> f:('err -> unit) -> unit
val map : ('ok, 'err) t -> f:('ok -> 'c) -> ('c, 'err) t
val map_error : ('ok, 'err) t -> f:('err -> 'c) -> ('ok, 'c) t
val combine : ('ok1, 'err) t -> ('ok2, 'err) t -> ok:('ok1 -> 'ok2 -> 'ok3) -> err:('err -> 'err -> 'err) -> ('ok3, 'err) t

Returns Ok if both are Ok and Error otherwise.

val combine_errors : ('ok, 'err) t list -> ('ok list, 'err list) t

combine_errors ts returns Ok if every element in ts is Ok, else it returns Error with all the errors in ts.

This is similar to all from Monad.S2, with the difference that all only returns the first error.

val combine_errors_unit : (unit, 'err) t list -> (unit, 'err list) t

combine_errors_unit returns Ok if every element in ts is Ok (), else it returns Error with all the errors in ts, like combine_errors.

val to_either : ('ok, 'err) t -> ('ok, 'err) Base__.Either0.t

to_either is useful with List.partition_map. For example:

let ints, exns =
  List.partition_map ["1"; "two"; "three"; "4"] ~f:(fun string ->
    Result.to_either (Result.try_with (fun () -> Int.of_string string)))
val of_either : ('ok, 'err) Base__.Either0.t -> ('ok, 'err) t
val ok_fst : ('ok, 'err) t -> ('ok, 'err) Base__.Either0.t
  • deprecated [since 2020-01] Use [to_either] instead.
val ok_if_true : bool -> error:'err -> (unit, 'err) t

ok_if_true returns Ok () if bool is true, and Error error if it is false.

val try_with : (unit -> 'a) -> ('a, exn) t
module Export = Base.Result.Export
module Let_syntax : sig ... end
val fold_left : f:('a -> (unit, 'b) t) -> 'a List.t -> (unit, 'b) t
val fold_right : f:('a -> (unit, 'b) t) -> 'a List.t -> (unit, 'b) t
OCaml

Innovation. Community. Security.