('a -> Result<'b option, 'c>) -> Result<'a option, 'c>
-> Result<'b option, 'c>
// string -> Result<int option, string>
let tryParseInt (s: string) =
match Int32.TryParse(s) with
| true, i -> Ok(Some i)
| false, _ -> Error "Could not parse string as int"
let result =
Ok(Some "123") // Result<string option, 'error>
|> ResultOption.bind tryParseInt // Result<int option, 'error>
// Ok (Some 123)
let result =
Ok None // Result<string option, 'error>
|> ResultOption.bind tryParseInt // Result<int option, 'error>
// Ok None
let result =
Ok(Some "bad things happened") // Result<string option, string>
|> ResultOption.bind tryParseInt // Result<int option, string>
// Error "Could not parse string as int"
let result =
Error "bad things happened" // Result<string option, string>
|> ResultOption.bind tryParseInt // Result<int option, string>
// Error "bad things happened"