package reason-standard
Module Standard.Option
Functions for working with optional values.
A function version of the Some constructor.
In most situations you just want to use the Some constructor directly.
However OCaml doesn't support piping to variant constructors.
Note that when using the Reason syntax you can use fast pipe (->) with variant constructors, so you don't need this function.
See the Reason docs for more.
Examples
String.reverse("desserts") |> Option.some = Some "desserts" Returns None if the first argument is None, otherwise return the second argument.
Unlike the built in && operator, the and_ function does not short-circuit.
When you call and_, both arguments are evaluated before being passed to the function.
Examples
Option.and_ (Some 11) (Some 22) = Some 22Option.and_ None (Some 22) = NoneOption.and_ (Some 11) None = NoneOption.and_ None None = NoneReturn the first argument if it isSome, otherwise return the second.
Unlike the built in || operator, the or_ function does not short-circuit. When you call or_, both arguments are evaluated before being passed to the function.
Examples
Option.or_ (Some 11) (Some 22) = Some 11Option.or_ None (Some 22) = Some 22Option.or_ (Some 11) None = Some 11Option.or_ None None = NoneTransform two options into an option of a Tuple.
Returns None if either of the aguments is None.
Examples
Option.both (Some 3004) (Some "Ant") = Some (3004, "Ant")Option.both (Some 3004) None = NoneOption.both None (Some "Ant") = NoneOption.both None None = NoneFlatten two optional layers into a single optional layer.
Examples
Option.flatten (Some (Some 4)) = Some 4Option.flatten (Some None) = NoneOption.flatten (None) = NoneTransform the value inside an option.
Leaves None untouched.
See Infix.(>>|) for an operator version of this function.
Examples
Option.map ~f:(fun x -> x * x) (Some 9) = Some 81Option.map ~f:Int.toString (Some 9) = Some "9"Option.map ~f:(fun x -> x * x) None = NoneCombine two Options
If both options are Some returns, as Some the result of running f on both values.
If either value is None, returns None
Examples
Option.map2 (Some 3) (Some 4) ~f:Int.add = Some 7Option.map2 (Some 3) (Some 4) ~f:Tuple.make = Some (3, 4)Option.map2 (Some 3) None ~f:Int.add = NoneOption.map2 None (Some 4) ~f:Int.add = NoneChain together many computations that may not return a value.
It is helpful to see its definition:
let flatMap t ~f =
match t with
| Some x -> f x
| None -> NoneThis means we only continue with the callback if we have a value.
For example, say you need to parse some user input as a month:
let toValidMonth (month: int) : (int option) =
if (1 <= month && month <= 12) then
Some month
else
None
in
let userInput = "5" in
Int.ofString userInput
|> Option.flatMap ~f:toValidMonthIf String.toInt produces None (because the userInput was not an integer) this entire chain of operations will short-circuit and result in None. If toValidMonth results in None, again the chain of computations will result in None.
See Infix.(>>=) for an operator version of this function.
Examples
Option.flatMap (Some [1, 2, 3]) ~f:List.head = Some 1Option.flatMap (Some []) ~f:List.head = Noneval get : 'a t -> default:'a -> 'aUnwrap an option('a) returning default if called with None.
This comes in handy when paired with functions like Map.get or List.head which return an Option.
Examples
Option.get ~default:99 (Some 42) = 42Option.get ~default:99 None = 99Option.get ~default:"unknown" (Map.get Map.String.empty "Tom") = "unknown"val (|?) : 'a t -> 'a -> 'aval getUnsafe : 'a t -> 'aUnwrap an option('a) returning the enclosed 'a.
Note in most situations it is better to use pattern matching, get, map or flatMap. Can you structure your code slightly differently to avoid potentially raising an exception?
Exceptions
Raises an Invalid_argument exception if called with None
Examples
List.head [1;2;3] |> Option.getUnsafe = 1List.head [] |> Option.getUnsafe (* raises 'Invalid_argument' *)val isSome : 'a t -> boolCheck if an Option is a Some.
In most situtations you should just use pattern matching instead.
Examples
Option.isSome (Some 3004) = trueOption.isSome None = falseval isNone : 'a t -> boolCheck if an Option is a None.
In most situtations you should just use pattern matching instead.
Examples
Option.isNone (Some 3004) = falseOption.isNone None = trueval forEach : 'a t -> f:('a -> unit) -> unitRun a function against a value, if it is present.
val toArray : 'a t -> 'a arrayConvert an option to a Array.
None is represented as an empty array and Some is represented as an array of one element.
Examples
Option.toArray (Some 3004) = [|3004|]Option.toArray (None) = [||]val toList : 'a t -> 'a listConvert an option to a List.
None is represented as an empty list and Some is represented as a list of one element.
Examples
Option.toList (Some 3004) = [3004]Option.toList (None) = []Compare
Test two optional values for equality using the provided function
Examples
Option.equal Int.equal (Some 1) (Some 1) = trueOption.equal Int.equal (Some 1) (Some 3) = falseOption.equal Int.equal (Some 1) None = falseOption.equal Int.equal None None = trueCompare two optional values using the provided function.
A None is "less" than a Some
Examples
Option.compare Int.compare (Some 1) (Some 3) = -1Option.compare Int.compare (Some 1) None = 1Option.compare Int.compare None None = 0The binding operator for Core.Option.map
Note Currently this is only supported by the OCaml syntax.
Note This requires at least OCaml 4.08 which means currently this is only supported by the native compiler.
The binding operator for Core.Option.both
Note Currently this is only supported by the OCaml syntax.
Note This requires at least OCaml 4.08 which means currently this is only supported by the native compiler.
The binding operator for Core.Option.flatMap
Note Currently this is only supported by the OCaml syntax.
Note This requires at least OCaml 4.08 which means currently this is only supported by the native compiler.
The binding operator for Core.Option.both
Note Currently this is only supported by the OCaml syntax.
Note This requires at least OCaml 4.08 which means currently this is only supported by the native compiler.