X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=towards_monads.mdwn;h=3b217cbdf507b6a330a68c2842f21e8316328a46;hp=acdfbb3304a0627ab2f33a743c68811c544f2489;hb=c486cebadaaf3b3a694bb141eb66ae96f6591b1f;hpb=4227828f80f4c9c05f10bfc14435747c31fbb934 diff --git a/towards_monads.mdwn b/towards_monads.mdwn index acdfbb33..3b217cbd 100644 --- a/towards_monads.mdwn +++ b/towards_monads.mdwn @@ -29,20 +29,20 @@ let div' (x:int) (y:int) = (* val div' : int -> int -> int option = fun -# div' 12 3;; -- : int option = Some 4 +# div' 12 2;; +- : int option = Some 6 # div' 12 0;; - : int option = None -# div' (div' 12 3) 2;; +# div' (div' 12 2) 3;; Characters 4-14: - div' (div' 12 3) 2;; - ^^^^^^^^^^ + div' (div' 12 2) 3;; + ^^^^^^^^^^ Error: This expression has type int option but an expression was expected of type int *) -This starts off well: dividing 12 by 3, no problem; dividing 12 by 0, +This starts off well: dividing 12 by 2, no problem; dividing 12 by 0, just the behavior we were hoping for. But we want to be able to use the output of the safe-division function as input for further division operations. So we have to jack up the types of the inputs: @@ -58,11 +58,11 @@ let div' (u:int option) (v:int option) = (* val div' : int option -> int option -> int option = -# div' (Some 12) (Some 4);; -- : int option = Some 3 +# div' (Some 12) (Some 2);; +- : int option = Some 6 # div' (Some 12) (Some 0);; - : int option = None -# div' (div' (Some 12) (Some 0)) (Some 4);; +# div' (div' (Some 12) (Some 0)) (Some 3);; - : int option = None *) @@ -84,7 +84,7 @@ let div' (u:int option) (v:int option) = So far so good. But what if we want to combine division with other arithmetic operations? We need to make those other operations -aware of the possibility that one of their arguments will trigger a +aware of the possibility that one of their arguments has triggered a presupposition failure:
@@ -124,11 +124,11 @@ let div' (u: int option) (v: int option) =
   bind' u (fun x -> bind' v (fun y -> if (0 = y) then None else Some (x / y)));;
 
 (*
-#  div' (div' (Some 12) (Some 2)) (Some 4);;
-- : int option = Some 1
-#  div' (div' (Some 12) (Some 0)) (Some 4);;
+#  div' (div' (Some 12) (Some 2)) (Some 3);;
+- : int option = Some 2
+#  div' (div' (Some 12) (Some 0)) (Some 3);;
 - : int option = None
-# add' (div' (Some 12) (Some 0)) (Some 4);;
+# add' (div' (Some 12) (Some 0)) (Some 3);;
 - : int option = None
 *)