Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

result

result is a type that represents either success (Ok) or failure (Error). Every result is either an Ok or an Error, both of which contain a value.

<span class='hljs-keyword'>type</span> result = <span class='hljs-keyword'>fn</span> <span class='hljs-type'>a</span> <span class='hljs-type'>b</span> <span class='hljs-keyword'>=&gt;</span> <span class='hljs-title function_'>Ok</span> <span class='hljs-keyword'>of</span> <span class='hljs-type'>a</span> | <span class='hljs-title function_'>Error</span> <span class='hljs-keyword'>of</span> <span class='hljs-type'>b</span>

Functions


Ok: '0 -> (result::t '0 '1)

Constructor for an Ok result.

Example

<span class='hljs-keyword'>let</span> my_OK = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span>

Error: '1 -> (result::t '0 '1)

Constructor for an Error result.

Example

<span class='hljs-keyword'>let</span> my_Error = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span>

is_ok: (result::t '0 '1) -> boolean

Returns true if the passed result is Ok, otherwise returns false.

Example

<span class='hljs-keyword'>let</span> my_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = 
<span class='hljs-keyword'>if</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>is_ok</span> my_result <span class='hljs-keyword'>then</span>
    <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>println</span> <span class='hljs-string'>"Ok!"</span>
<span class='hljs-keyword'>else</span>
    <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>println</span> <span class='hljs-string'>"Error!"</span>

<span class='hljs-comment'>(* prints "Ok!" *)</span>

is_err: (result::t '0 '1) -> boolean

Returns true if the passed result is Error, otherwise returns false.

Example

<span class='hljs-keyword'>let</span> my_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-variable constant_'>2</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = 
<span class='hljs-keyword'>if</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>is_err</span> my_result <span class='hljs-keyword'>then</span>
    <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> <span class='hljs-string'>"Error!"</span>
<span class='hljs-keyword'>else</span>
    <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> <span class='hljs-string'>"Ok!"</span>

<span class='hljs-comment'>(* prints "Error!" *)</span>

unwrap_ok: (result::t '0 '1) -> '0

Returns the value contained in the passed Ok result. Panics if the result is Error.

Notes

It is recommended that you use pattern matching in most cases instead of this.

Example

<span class='hljs-keyword'>let</span> my_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Hatsune Miku"</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = my_result <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_ok</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>

<span class='hljs-comment'>(* prints "Hatsune Miku" *)</span>

unwrap_err: (result::t '0 '1) -> '1

Returns the value contained in the passed Error result. Panics if the result is Ok.

Notes

It is recommended that you use pattern matching in most cases instead of this.

Example

<span class='hljs-keyword'>let</span> my_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = my_result <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_err</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>

<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>

res_and: (result::t '0 '1) -> (result::t '0 '1) -> (result::t '0 '1)

If the first result passed is Ok, returns the second one. Otherwise, return the first result, which is an Error.

Example

<span class='hljs-keyword'>let</span> my_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>res_and</span> Error<span class='hljs-punctuation'>(</span><span class='hljs-string'>"Hatsune Miku"</span><span class='hljs-punctuation'>)</span> 
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-keyword'>match</span> my_result <span class='hljs-keyword'>with</span>
| result<span class='hljs-punctuation'>:</span><span class='hljs-type'>Ok</span> <span class='hljs-type'>of</span> <span class='hljs-type'>a</span> <span class='hljs-keyword'>=&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> a
| result<span class='hljs-punctuation'>:</span><span class='hljs-type'>Error</span> <span class='hljs-type'>of</span> <span class='hljs-type'>b</span> <span class='hljs-keyword'>=&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> b
<span class='hljs-comment'>(* prints "Hatsune Miku" *)</span>

<span class='hljs-keyword'>let</span> new_result = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>res_and</span> Error<span class='hljs-punctuation'>(</span><span class='hljs-string'>"Hatsune Miku"</span><span class='hljs-punctuation'>)</span>
<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-keyword'>match</span> new_result <span class='hljs-keyword'>with</span>
| <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-keyword'>of</span> a <span class='hljs-keyword'>=&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> a
| <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-keyword'>of</span> b <span class='hljs-keyword'>=&gt;</span> <span class='hljs-title class_'>std</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> b
<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>

expect: string -> (result::t '0 '1) -> '0

Returns the enclosed result value if the passed result is Ok. If the passed result is an Error, prints the passed string, then panics.

Example

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>expect</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Try doing it right next time"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> 
<span class='hljs-comment'>(* prints "Akita Neru" *)</span>

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>expect</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Try doing it right next time"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> 
<span class='hljs-comment'>(* prints "Try doing it right next time", then panics *)</span>

res_or: (result::t '0 '1) -> (result::t '0 '1) -> (result::t '0 '1)

Returns the first passed result if it is Ok, otherwise returns the second passed result.

Example

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>res_or</span> Error <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_ok</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> 
<span class='hljs-comment'>(* prints "Akita Neru" *)</span>

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>res_or</span> Error <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_err</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>
<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Akita Neru"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>res_or</span> Ok <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_ok</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>
<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>

unwrap_or: (result::t '0 '1) -> '0 -> '0

Returns the value enclosed in the first passed result if its Ok, otherwise return the second passed value.

Example

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Hatsune Miku"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_or</span> <span class='hljs-string'>"Kasane Teto"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> 
<span class='hljs-comment'>(* prints "Hatsune Miku" *)</span>

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Hatsune Miku"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_or</span> <span class='hljs-string'>"Kasane Teto"</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span> 
<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>

and_then: (result::t '0 '1) -> ('0 -> '1) -> (result::t '0 '1)

If the passed result is Ok, returns a new result with an enclosed value equal to the passed result's enclosed value with the passed function appplied to it. Otherwise, returns the passed Error.

Example

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Ok</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>and_then</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=&gt;</span> string<span class='hljs-punctuation'>:</span>concatenate a <span class='hljs-string'>" is my favorite"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_ok</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>
<span class='hljs-comment'>(* prints "Kasane Teto is my favorite" *)</span>

<span class='hljs-keyword'>let</span> <span class='hljs-punctuation'>(</span><span class='hljs-punctuation'>)</span> = <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>Error</span> <span class='hljs-punctuation'>(</span><span class='hljs-string'>"Kasane Teto"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>and_then</span> <span class='hljs-punctuation'>(</span><span class='hljs-keyword'>fn</span> <span class='hljs-params'>a</span> <span class='hljs-keyword'>=&gt;</span> string<span class='hljs-punctuation'>:</span>concatenate a <span class='hljs-string'>" is my favorite"</span><span class='hljs-punctuation'>)</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>result</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>unwrap_err</span> <span class='hljs-operator'>|&gt;</span> <span class='hljs-title class_'>string</span><span class='hljs-punctuation'>::</span><span class='hljs-title function_'>print</span>
<span class='hljs-comment'>(* prints "Kasane Teto" *)</span>