X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=week7.mdwn;h=a78a77e291a6d71883a8acadd5bdc3fa9f2769c4;hp=9f139c1648734b93cd944c15d16c095c5f0cfe52;hb=ef954bbcb3b568413e2dd48374dbeb7201ccd4bb;hpb=ea61c563f158b9f279a5efb28b407bc818af43d3 diff --git a/week7.mdwn b/week7.mdwn index 9f139c16..a78a77e2 100644 --- a/week7.mdwn +++ b/week7.mdwn @@ -48,24 +48,24 @@ that provides at least the following three elements: use a container metaphor: if `x` has type `int option`, then `x` is a box that (may) contain an integer. - type 'a option = None | Some of 'a;; + `type 'a option = None | Some of 'a;;` * A way to turn an ordinary value into a monadic value. In Ocaml, we did this for any integer n by mapping an arbitrary integer `n` to the option `Some n`. To be official, we can define a function called unit: - let unit x = Some x;; - val unit : 'a -> 'a option = + `let unit x = Some x;;` + + `val unit : 'a -> 'a option = ` So `unit` is a way to put something inside of a box. * A bind operation (note the type): -
-     let bind m f = match m with None -> None | Some n -> f n;;
-     val bind : 'a option -> ('a -> 'b option) -> 'b option = 
-
+ `let bind m f = match m with None -> None | Some n -> f n;;` + + `val bind : 'a option -> ('a -> 'b option) -> 'b option = ` `bind` takes two arguments (a monadic object and a function from ordinary objects to monadic objects), and returns a monadic @@ -77,7 +77,7 @@ that provides at least the following three elements: Then the second argument uses `x` to compute a new monadic value. Conceptually, then, we have - let bind m f = (let x = unwrap m in f x);; + `let bind m f = (let x = unwrap m in f x);;` The guts of the definition of the `bind` operation amount to specifying how to unwrap the monadic object `m`. In the bind @@ -105,14 +105,14 @@ them from hurting the people that use them or themselves. object, we have `(unit x) * f == f x`. For instance, `unit` is a function of type `'a -> 'a option`, so we have -
-# let ( * ) m f = match m with None -> None | Some n -> f n;;
-val ( * ) : 'a option -> ('a -> 'b option) -> 'b option = 
-# let unit x = Some x;;
-val unit : 'a -> 'a option = 
-# unit 2 * unit;;
-- : int option = Some 2
-
+
+    # let ( * ) m f = match m with None -> None | Some n -> f n;;
+    val ( * ) : 'a option -> ('a -> 'b option) -> 'b option = 
+    # let unit x = Some x;;
+    val unit : 'a -> 'a option = 
+    # unit 2 * unit;;
+    - : 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