index 87d5566..43c3ef5 100644 (file)
@@ -1,4 +1,17 @@
+Assignment 5
+
Types and OCAML
+---------------
+
+0. Recall that the S combinator is given by \x y z. x z (y z).
+   Give two different typings for this function in OCAML.
+   To get you started, here's one typing for K:
+
+    # let k (y:'a) (n:'b) = y;;
+    val k : 'a -> 'b -> 'a = <fun>
+    # k 1 true;;
+    - : int = 1
+

1. Which of the following expressions is well-typed in OCAML?
For those that are, give the type of the expression as a whole.
@@ -75,7 +88,7 @@ This almost works.  For instance,
evaluates to 1, and

let b = true in let y = 1 in let n = 2 in
-    match b with true -> 1 | false -> 2;;
+    match b with true -> y | false -> n;;

also evaluates to 1.  Likewise,

@@ -108,3 +121,20 @@ or of `match`.  That is, you must keep the `let` statements, though
you're allowed to adjust what `b`, `y`, and `n` get assigned to.

[[Hint assignment 5 problem 3]]
+
+4. Baby monads.  Read the lecture notes for week 6, then write a
+   function `lift` that generalized the correspondence between + and
+   `add`: that is, `lift` takes any two-place operation on integers
+   and returns a version that takes arguments of type `int option`
+   instead, returning a result of `int option`.  In other words,
+   `lift` will have type
+
+     (int -> int -> int) -> (int option) -> (int option) -> (int option)
+
+   so that `lift (+) (Some 3) (Some 4)` will evalute to `Some 7`.
+   Don't worry about why you need to put `+` inside of parentheses.
+   You should make use of `bind` in your definition of `lift`:
+
+    let bind (x: int option) (f: int -> (int option)) =
+      match x with None -> None | Some n -> f n;;
+