Monad_exts_types.S
S
contains extensions for a monad.
To create an instance of S
, use Monad_exts.Extend
.
S
subsumes S_let
.
then_m x y
sequentially composes the actions x
and y
as with >>=
, but, rather than using the returned value of x
, it instead just returns y
.
compose_m f g
is the Kleisli composition of f
and g
.
map_when_m ?otherwise condition ~f a
is f a
when condition
is true, and otherwise a
(by default, return
) otherwise.
when_m ?otherwise condition ~f
is f ()
when condition
is true, and otherwise ()
(by default, return
) otherwise.
map_unless_m ?otherwise condition ~f a
is f a
when condition
is false, and otherwise a
(by default, return
) otherwise.
unless_m ?otherwise condition ~f
is f ()
when condition
is false, and otherwise ()
(by default, return
) otherwise.
tee_m val ~f
executes f val
for its monadic action, then returns val
.
Example (using an extended Or_error):
let fail_if_negative x =
On_error.when_m (Int.is_negative x) ~f:(fun () ->
Or_error.error_string "value is negative!" )
in
Or_error.(42 |> tee_m ~f:fail_if_negative >>| fun x -> x * x)
(* Ok (1764) *)
val tee : 'a -> f:('a -> unit) -> 'a t
tee val ~f
behaves as tee_m
, but takes a non-monadic f
.
Example (using an extended Or_error):
let print_if_negative x =
if Int.negative x then Stdio.print_string "value is negative!"
in
Or_error.(
try_get_value () >>= tee ~f:print_if_negative >>= try_use_value () )