projects
/
lambda.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
manip trees: tweaks
[lambda.git]
/
manipulating_trees_with_monads.mdwn
diff --git
a/manipulating_trees_with_monads.mdwn
b/manipulating_trees_with_monads.mdwn
index
62c9465
..
d3ccc98
100644
(file)
--- a/
manipulating_trees_with_monads.mdwn
+++ b/
manipulating_trees_with_monads.mdwn
@@
-44,7
+44,7
@@
We'll be using trees where the nodes are integers, e.g.,
Our first task will be to replace each leaf with its double:
Our first task will be to replace each leaf with its double:
- let rec treemap (newleaf
:'a -> 'b) (t:'a tree):('b tree)
=
+ let rec treemap (newleaf
: 'a -> 'b) (t : 'a tree) : 'b tree
=
match t with
| Leaf x -> Leaf (newleaf x)
| Node (l, r) -> Node ((treemap newleaf l),
match t with
| Leaf x -> Leaf (newleaf x)
| Node (l, r) -> Node ((treemap newleaf l),
@@
-118,12
+118,12
@@
enough for now to expect that our reader will expect a function of
type `int->int`.
type 'a reader = (int->int) -> 'a;; (* mnemonic: e for environment *)
type `int->int`.
type 'a reader = (int->int) -> 'a;; (* mnemonic: e for environment *)
- let reader_unit (x
:'a)
: 'a reader = fun _ -> x;;
- let reader_bind (u: 'a reader) (f
:'a -> 'c reader):
'c reader = fun e -> f (u e) e;;
+ let reader_unit (x
: 'a)
: 'a reader = fun _ -> x;;
+ let reader_bind (u: 'a reader) (f
: 'a -> 'c reader) :
'c reader = fun e -> f (u e) e;;
It's easy to figure out how to turn an `int` into an `int reader`:
It's easy to figure out how to turn an `int` into an `int reader`:
- let int2int_reader (x
:'a): 'b reader = fun (op:
'a -> 'b) -> op x;;
+ let int2int_reader (x
: 'a): 'b reader = fun (op :
'a -> 'b) -> op x;;
int2int_reader 2 (fun i -> i + i);;
- : int = 4
int2int_reader 2 (fun i -> i + i);;
- : int = 4
@@
-131,7
+131,7
@@
But what do we do when the integers are scattered over the leaves of a
tree? A binary tree is not the kind of thing that we can apply a
function of type `int->int` to.
tree? A binary tree is not the kind of thing that we can apply a
function of type `int->int` to.
- let rec treemonadizer (f
:'a -> 'b reader) (t:'a tree):('b tree)
reader =
+ let rec treemonadizer (f
: 'a -> 'b reader) (t : 'a tree) : 'b tree
reader =
match t with
| Leaf x -> reader_bind (f x) (fun x' -> reader_unit (Leaf x'))
| Node (l, r) -> reader_bind (treemonadizer f l) (fun x ->
match t with
| Leaf x -> reader_bind (f x) (fun x' -> reader_unit (Leaf x'))
| Node (l, r) -> reader_bind (treemonadizer f l) (fun x ->
@@
-172,7
+172,7
@@
Gratifyingly, we can use the `treemonadizer` function without any
modification whatsoever, except for replacing the (parametric) type
`reader` with `state`:
modification whatsoever, except for replacing the (parametric) type
`reader` with `state`:
- let rec treemonadizer (f
:'a -> 'b state) (t:'a tree):('b tree)
state =
+ let rec treemonadizer (f
: 'a -> 'b state) (t : 'a tree) : 'b tree
state =
match t with
| Leaf x -> state_bind (f x) (fun x' -> state_unit (Leaf x'))
| Node (l, r) -> state_bind (treemonadizer f l) (fun x ->
match t with
| Leaf x -> state_bind (f x) (fun x' -> state_unit (Leaf x'))
| Node (l, r) -> state_bind (treemonadizer f l) (fun x ->
@@
-219,7
+219,7
@@
of leaves?
let continuation_unit x c = c x;;
let continuation_bind u f c = u (fun a -> f a c);;
let continuation_unit x c = c x;;
let continuation_bind u f c = u (fun a -> f a c);;
- let rec treemonadizer (f
:'a -> ('b, 'r) continuation) (t:'a tree):(('b tree)
, 'r) continuation =
+ let rec treemonadizer (f
: 'a -> ('b, 'r) continuation) (t : 'a tree) : ('b tree
, 'r) continuation =
match t with
| Leaf x -> continuation_bind (f x) (fun x' -> continuation_unit (Leaf x'))
| Node (l, r) -> continuation_bind (treemonadizer f l) (fun x ->
match t with
| Leaf x -> continuation_bind (f x) (fun x' -> continuation_unit (Leaf x'))
| Node (l, r) -> continuation_bind (treemonadizer f l) (fun x ->
@@
-276,8
+276,8
@@
Of course, by now you may have realized that we have discovered a new
monad, the binary tree monad:
type 'a tree = Leaf of 'a | Node of ('a tree) * ('a tree);;
monad, the binary tree monad:
type 'a tree = Leaf of 'a | Node of ('a tree) * ('a tree);;
- let tree_unit (x:'a) = Leaf x;;
- let rec tree_bind (u
:'a tree) (f:'a -> 'b tree):
'b tree =
+ let tree_unit (x:
'a) = Leaf x;;
+ let rec tree_bind (u
: 'a tree) (f : 'a -> 'b tree) :
'b tree =
match u with
| Leaf x -> f x
| Node (l, r) -> Node ((tree_bind l f), (tree_bind r f));;
match u with
| Leaf x -> f x
| Node (l, r) -> Node ((tree_bind l f), (tree_bind r f));;