X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=week7.mdwn;h=a4538ee3e3e5572c504adf9495bc9e594224c8e7;hp=52bc8eb5d2e9855e872cfca13bc469d1582e8b36;hb=63b3d068ec7da4f7ad620d2e8ff674495b642024;hpb=f1086f391556371f688a6ed2807da5e127d69608 diff --git a/week7.mdwn b/week7.mdwn index 52bc8eb5..a4538ee3 100644 --- a/week7.mdwn +++ b/week7.mdwn @@ -114,17 +114,17 @@ val unit : 'a -> 'a option = - : int option = Some 2 - 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`. +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: @@ -135,15 +135,15 @@ Some 3 * (fun x -> unit x * unit);; - : int option = Some 3 - Of course, associativity must hold for arbitrary functions of - type `'a -> M 'a`, where `M` is the monad type. It's easy to - convince yourself that the bind operation for the option monad - obeys associativity by dividing the inputs into cases: if `m` - matches `None`, both computations will result in `None`; if - `m` matches `Some n`, and `f n` evalutes to `None`, then both - computations will again result in `None`; and if the value of - `f n` matches `Some r`, then both computations will evaluate - to `g r`. +Of course, associativity must hold for arbitrary functions of +type `'a -> M 'a`, where `M` is the monad type. It's easy to +convince yourself that the bind operation for the option monad +obeys associativity by dividing the inputs into cases: if `m` +matches `None`, both computations will result in `None`; if +`m` matches `Some n`, and `f n` evalutes to `None`, then both +computations will again result in `None`; and if the value of +`f n` matches `Some r`, then both computations will evaluate +to `g r`. * Right identity: unit is a right identity for bind. That is, `m * unit == m` for all monad objects `m`. For instance,