From db35cd7468a6353ab2c15a1381edbc550a2ecc61 Mon Sep 17 00:00:00 2001 From: Jim Pryor Date: Wed, 1 Dec 2010 02:27:28 -0500 Subject: [PATCH] manip trees: tweaks Signed-off-by: Jim Pryor --- manipulating_trees_with_monads.mdwn | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/manipulating_trees_with_monads.mdwn b/manipulating_trees_with_monads.mdwn index 62c94652..d3ccc985 100644 --- 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: - 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), @@ -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 *) - 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`: - 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 @@ -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. - 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 -> @@ -172,7 +172,7 @@ Gratifyingly, we can use the `treemonadizer` function without any 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 -> @@ -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 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 -> @@ -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);; - 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));; -- 2.11.0