spell out reader-bind more explicitly
authorJim Pryor <profjim@jimpryor.net>
Wed, 3 Nov 2010 11:50:11 +0000 (07:50 -0400)
committerJim Pryor <profjim@jimpryor.net>
Wed, 3 Nov 2010 11:50:11 +0000 (07:50 -0400)
Signed-off-by: Jim Pryor <profjim@jimpryor.net>
reader_monad_for_intensionality.mdwn
reader_monad_for_variable_binding.mdwn

index 5582734..7425be4 100644 (file)
@@ -128,7 +128,9 @@ Now we are ready for the intensionality monad:
 <pre>
 type 'a intension = s -> 'a;;
 let unit x = fun (w:s) -> x;;
-let bind u f = fun (w:s) -> f (u w) w;;
+(* as before, bind can be written more compactly, but having
+   it spelled out like this will be useful down the road *)
+let bind u f = fun (w:s) -> let a = u w in let u' = f a in u' w;;
 </pre>
 
 Then the individual concept `unit ann` is a rigid designator: a
index 9ddddc8..3591c24 100644 (file)
@@ -155,7 +155,10 @@ Here we'll use a different monad. It's called the **Reader monad**. We define it
 
        (* here's our bind operation; how does it work? *)
        let bind (u : 'a reader) (f: 'a -> 'b reader) : 'b reader =
-               fun (e : env) -> f (u e) e
+               (* this can be written more compactly, but having it spelled out
+                  like this will be useful down the road *)
+               fun (e : env) -> let a = u e in let u' = f a in u' e
+
 
        (* we also define two special-purpose operations on our reader-monad values *)