edits
[lambda.git] / zipper-lists-continuations.mdwn
index 8c052f0..6ec4d34 100644 (file)
@@ -5,9 +5,7 @@ continuation monad.
 
 The three approches are:
 
-*    Rethinking the list monad;
-*    Montague's PTQ treatment of DPs as generalized quantifiers; and
-*    Refunctionalizing zippers (Shan: zippers are defunctionalized continuations);
+[[!toc]]
 
 Rethinking the list monad
 -------------------------
@@ -28,10 +26,10 @@ constructor is
 
 then we can deduce the unit and the bind:
 
-    runit x:'a -> 'a reader = fun (e:env) -> x
+    r_unit x:'a -> 'a reader = fun (e:env) -> x
 
 Since the type of an `'a reader` is `fun e:env -> 'a` (by definition),
-the type of the `runit` function is `'a -> e:env -> 'a`, which is a
+the type of the `r_unit` function is `'a -> e:env -> 'a`, which is a
 specific case of the type of the *K* combinator.  So it makes sense
 that *K* is the unit for the reader monad.
 
@@ -45,7 +43,8 @@ We can deduce the correct `bind` function as follows:
 
 We have to open up the `u` box and get out the `'a` object in order to
 feed it to `f`.  Since `u` is a function from environments to
-objects of type `'a`, we'll have
+objects of type `'a`, the way we open a box in this monad is
+by applying it to an environment:
 
          .... f (u e) ...
 
@@ -230,10 +229,12 @@ Sigh.  Ocaml won't show us our own list.  So we have to choose an `f`
 and a `z` that will turn our hand-crafted lists into standard Ocaml
 lists, so that they will print out.
 
+<pre>
 # let cons h t = h :: t;;  (* Ocaml is stupid about :: *)
 # l'_bind (fun f z -> f 1 (f 2 z)) 
           (fun i -> fun f z -> f i (f (i+1) z)) cons [];;
 - : int list = [1; 2; 2; 3]
+</pre>
 
 Ta da!
 
@@ -304,3 +305,6 @@ versa.  The connections will be expecially relevant when we consider
 indefinites and Hamblin semantics on the linguistic side, and
 non-determinism on the list monad side.
 
+Refunctionalizing zippers
+-------------------------
+