John_x thinks Mary_y said he_x likes her_y.
- See her 1999 paper for details.
+ See her 1999 paper for details. Essentially, she ends up layering several
+Reader monads over each other.
Here is [[code for the arithmetic tree Chris presented in week 8|code/arith1.ml]]. It computes
-`\x. (+ 1 (* (/ 6 x) 4))`. Your task is to modify it to compute
-`\x y. (+ 1 (* (/ 6 x) y))`. You will need to modify five lines.
+`\n. (+ 1 (* (/ 6 n) 4))`. Your task is to modify it to compute
+`\n m. (+ 1 (* (/ 6 n) m))`. You will need to modify five lines.
The first one is the type of a boxed int. Instead of `type num = int
-> int`, you'll need
type num = int -> int -> int
The second and third are the definitions of `mid` and `map2`. The fourth
-is the one that encodes the variable `x`, the line that begins `(Leaf
-(Num (fun x -> ...`. The fifth line you need to modify is the one
-that replaces "4" with "y". When you have these lines modified,
+is the one that encodes the variable `n`, the line that begins `(Leaf
+(Num (fun n -> ...`. The fifth line you need to modify is the one
+that replaces "4" with "m". When you have these lines modified,
you should be able to execute the following expression:
# match eval t2 with Leaf (Num f) -> f 2 4;;
- : int = 13
-2. Based on the evaluator code from the assignment from week 7, and what you've learned about the Reader monad,
+2. Based on [[the evaluator code from assignment 7|/exercises/assignment7/#index3h2]], and what you've learned about the Reader monad,
enhance the arithmetic tree code to handle an arbitrary set of free variables. Don't use Juli8 libraries for this; just do it by hand.
Return to the original code (that is, before the modifications required by the previous problem).
-- substitute your own choices for the type Env and value env0
let { xx :: ReaderT Env Maybe Int; xx = return 1 } in runReaderT xx env0
- Okay, here are some questions about various monad transformers. Use OCaml to help you answer them. Which combined monad has the type of an optional list (that is, either `None` or `Some [...]`): an Option transformer wrapped around an underlying List monad, or a List transformer wrapped around an underlying Option monad? Which combined monad has the type of a function from `store`s to a pair `('a list, store)`: a List transformer wrapped around an underlying State monad or a State transformer wrapped around an underlying List monad?
+ Okay, here are some questions about various monad transformers. Use OCaml or Haskell to help you answer them. Which combined monad has the type of an optional list (that is, either `None` or `Some [...]`): an Option transformer wrapped around an underlying List monad, or a List transformer wrapped around an underlying Option monad? Which combined monad has the type of a function from `store`s to a pair `('a list, store)`: a List transformer wrapped around an underlying State monad or a State transformer wrapped around an underlying List monad?
The last two problems are non-monadic.