object, we have `(unit x) * f == f x`. For instance, `unit` is a
function of type `'a -> 'a option`, so we have
- <pre>
- # let ( * ) m f = match m with None -> None | Some n -> f n;;
- val ( * ) : 'a option -> ('a -> 'b option) -> 'b option = <fun>
- # let unit x = Some x;;
- val unit : 'a -> 'a option = <fun>
- # unit 2 * unit;;
- - : int option = Some 2
- </pre>
-
- The parentheses is the magic for telling Ocaml that the
- function to be defined (in this case, the name of the function
- is `*`, pronounced "bind") is an infix operator, so we write
- `m * f` or `( * ) m f` instead of `* m f`.
+<pre>
+# let ( * ) m f = match m with None -> None | Some n -> f n;;
+val ( * ) : 'a option -> ('a -> 'b option) -> 'b option = <fun>
+# let unit x = Some x;;
+val unit : 'a -> 'a option = <fun>
+# unit 2 * unit;;
+- : int option = Some 2
+</pre>
+
+The parentheses is the magic for telling Ocaml that the
+function to be defined (in this case, the name of the function
+is `*`, pronounced "bind") is an infix operator, so we write
+`m * f` or `( * ) m f` instead of `* m f`.
* Associativity: bind obeys a kind of associativity, like this:
- (m * f) * g == m * (fun x -> f x * g)
+ `(m * f) * g == m * (fun x -> f x * g)`
- If you don't understand why the lambda form is necessary, you need
- to look again at the type of bind. This is important.
+ If you don't understand why the lambda form is necessary (the "fun
+ x" part), you need to look again at the type of bind.
For an illustration of associativity in the option monad: