OCaml Result Patterns
OCaml 5.x provides Result.Syntax for monadic chaining and Result.get_ok/Result.get_error for extraction.
Result.Syntax
Use open Result.Syntax to get let* and let+ bindings:
open Result.Syntax
let process request =
let* req = validate request in
let* auth = authenticate req in
let* _ = authorize auth in
execute req
DO NOT define local let ( let* ) = Result.bind. Use open Result.Syntax instead.
Extracting Values
| Function | Behavior on Error |
|---|---|
Result.get_ok r |
Raises Invalid_argument |
Result.get_error r |
Raises Invalid_argument |
Result.value r ~default |
Returns default |
Use Result.get_ok only when failure is a programming error:
(* Startup/config - crash on failure is intentional *)
let config = Result.get_ok (Config.load ())
(* Test setup - failure means test bug *)
let client = Result.get_ok (Tls.Config.client ~authenticator ())
Custom get_ok
Only define custom get_ok when you need different exception behavior:
(* Raises domain-specific Protocol_error instead of Invalid_argument *)
let get_ok = function
| Ok x -> x
| Error e -> raise (Protocol_error e)
If you just want Invalid_argument, use Result.get_ok directly.