projects
/
lambda.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
edits
[lambda.git]
/
zipper-lists-continuations.mdwn
diff --git
a/zipper-lists-continuations.mdwn
b/zipper-lists-continuations.mdwn
index
bfd144c
..
581cdf4
100644
(file)
--- a/
zipper-lists-continuations.mdwn
+++ b/
zipper-lists-continuations.mdwn
@@
-26,10
+26,10
@@
constructor is
then we can deduce the unit and the bind:
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),
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.
specific case of the type of the *K* combinator. So it makes sense
that *K* is the unit for the reader monad.
@@
-43,18
+43,19
@@
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
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) ...
This subexpression types to `'b reader`, which is good. The only
.... f (u e) ...
This subexpression types to `'b reader`, which is good. The only
-problem is that we
don't have an `e`, so we have to abstract over that
-
variable
:
+problem is that we
invented an environment `e` that we didn't already have ,
+
so we have to abstract over that variable to balance the books
:
fun e -> f (u e) ...
This types to `env -> 'b reader`, but we want to end up with `env ->
fun e -> f (u e) ...
This types to `env -> 'b reader`, but we want to end up with `env ->
-'b`.
The easiest way to turn a 'b reader into a 'b
is to apply it to
+'b`.
Once again, the easiest way to turn a `'b reader` into a `'b`
is to apply it to
an environment. So we end up as follows:
r_bind (u:'a reader) (f:'a -> 'b reader):('b reader) = f (u e) e
an environment. So we end up as follows:
r_bind (u:'a reader) (f:'a -> 'b reader):('b reader) = f (u e) e