summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
34c7039)
Signed-off-by: Jim Pryor <profjim@jimpryor.net>
operations. So we have to jack up the types of the inputs:
<pre>
operations. So we have to jack up the types of the inputs:
<pre>
-let div' (x:int option) (y:int option) =
- match y with
+let div' (u:int option) (v:int option) =
+ match v with
None -> None
| Some 0 -> None
None -> None
| Some 0 -> None
- | Some n -> (match x with
+ | Some y -> (match u with
- | Some m -> Some (m / n));;
+ | Some x -> Some (x / y));;
(*
val div' : int option -> int option -> int option = <fun>
(*
val div' : int option -> int option -> int option = <fun>
built-in tuple type:
<pre>
built-in tuple type:
<pre>
-let div' (x:int option) (y:int option) =
- match (x, y) with
+let div' (u:int option) (v:int option) =
+ match (u, v) with
(None, _) -> None
| (_, None) -> None
| (_, Some 0) -> None
(None, _) -> None
| (_, None) -> None
| (_, Some 0) -> None
- | (Some m, Some n) -> Some (m / n);;
+ | (Some x, Some y) -> Some (x / y);;
</pre>
So far so good. But what if we want to combine division with
</pre>
So far so good. But what if we want to combine division with
presupposition failure:
<pre>
presupposition failure:
<pre>
-let add' (x:int option) (y:int option) =
- match (x, y) with
+let add' (u:int option) (v:int option) =
+ match (u, v) with
(None, _) -> None
| (_, None) -> None
(None, _) -> None
| (_, None) -> None
- | (Some m, Some n) -> Some (m + n);;
+ | (Some x, Some y) -> Some (x + y);;
(*
val add' : int option -> int option -> int option = <fun>
(*
val add' : int option -> int option -> int option = <fun>
well chosen to resonate with linguists, but what can you do). To continue our mnemonic association, we'll put a `'` after the name "bind" as well.
<pre>
well chosen to resonate with linguists, but what can you do). To continue our mnemonic association, we'll put a `'` after the name "bind" as well.
<pre>
-let bind' (x: int option) (f: int -> (int option)) =
- match x with
+let bind' (u: int option) (f: int -> (int option)) =
+ match u with
-let add' (x: int option) (y: int option) =
- bind' x (fun x -> bind' y (fun y -> Some (x + y)));;
+let add' (u: int option) (v: int option) =
+ bind' u (fun x -> bind' v (fun y -> Some (x + y)));;
-let div' (x: int option) (y: int option) =
- bind' x (fun x -> bind' y (fun y -> if (0 = y) then None else Some (x / y)));;
+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);;
(*
# div' (div' (Some 12) (Some 2)) (Some 4);;