cps tweaks
authorJim Pryor <profjim@jimpryor.net>
Tue, 14 Dec 2010 10:35:11 +0000 (05:35 -0500)
committerJim Pryor <profjim@jimpryor.net>
Tue, 14 Dec 2010 10:35:11 +0000 (05:35 -0500)
Signed-off-by: Jim Pryor <profjim@jimpryor.net>
cps_and_continuation_operators.mdwn

index 258f722..d1a85cf 100644 (file)
@@ -481,7 +481,7 @@ To demonstrate the different adding order between Examples 4 and 5, we use `::`
            let u = shift (fun k -> k [1] >>= fun x -> unit (10 :: x))
            in u >>= fun x -> unit (100 :: x)
          ) in let w = v >>= fun x -> unit (1000 :: x)
-         in run0  w)
+         in run0  w);;
        - : int list = [1000; 10; 100; 1]
 
 
@@ -493,7 +493,23 @@ Example 6:
          (app (reset (app2 (op2 plus) (var ten)
            (shift (\k. (var k))))) (var one))
        
-       (* not sure if this example can be typed as-is in OCaml. We may need a sum-type *)
+       (* not sure if this example can be typed as-is in OCaml... this is the best I an do at the moment... *)
+
+       # type 'x either = Left of (int -> ('x,'x either) Continuation_monad.m) | Right of int;;
+       # Continuation_monad.(let v = reset (
+           shift (fun k -> unit (Left k)) >>= fun i -> unit (Right (10+i))
+         ) in let w = v >>= fun (Left k) ->
+             k 1 >>= fun (Right i) ->
+             unit (100+i)
+         in run0 w);;
+       - : int = 111
+
+<!--
+# type either = Left of (int -> either) | Right of int;;
+# let getleft e = match e with Left lft -> lft | Right _ -> failwith "not a Left";;
+# let getright e = match e with Right rt -> rt | Left _ -> failwith "not a Right";;
+# 100 + getright (let v = reset (fun p () -> Right (10 + shift p (fun k -> Left k))) in getleft v 1);;
+-->
 
 Example 7: