X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=assignment6.mdwn;h=82aee95f9bdcb506e52c1307a54a15ce9340e899;hp=919ff24f246a565a8c13157d2ed56987b46263ee;hb=ce6251343f916dcbfeb7160aff5b1312fa31ce7f;hpb=01979f60c8474ffe20e4a1a20d59bfff5d3950c6 diff --git a/assignment6.mdwn b/assignment6.mdwn index 919ff24f..82aee95f 100644 --- a/assignment6.mdwn +++ b/assignment6.mdwn @@ -1,27 +1,31 @@ -1. **Build a state monad.** Based on the division by zero monad, +1. **Build a State monad.** Based on the division by zero monad, build a system that will evaluate arithmetic expressions. Instead of returning a simple integer as a result, it will deliver the correct answer along with a count of the number of operations performed during -the calculuation. That is, the desired behavior should be like this: +the calculation. That is, the desired behavior should be like this: - # lift ( + ) (lift ( / ) (unit 20) (unit 2)) (lift ( * ) (unit 2) (unit 3)) 0;; - - : int * int = (16, 3) + # lift2 ( + ) (lift2 ( / ) (unit 20) (unit 2)) + (lift2 ( * ) (unit 2) (unit 3)) 0;; + - : int * int = (16, 3) -Here, `lift` is the function that uses `bind` to prepare an ordinary + Here, `lift2` is the function that uses `bind` to prepare an ordinary arithmetic operator (such as addition `( + )`, division `( / )`, or multiplication `( * )`) to recieve objects from the counting monad as arguments. The response of the interpreter says two things: that -(20/2) + (2*3) = 16, and that the computation took three arithmetic +(20/2) + (2\*3) = 16, and that the computation took three arithmetic steps. By the way, that zero at the end provides the monadic object with a starting point (0 relevant computations have occurred previous to the current computation). -Assume for the purposes of this excercise that no one ever tries to + Assume for the purposes of this excercise that no one ever tries to divide by zero (so there should be no int option types anywhere in your solution). -You'll need to define a computation monad type, unit, bind, and lift. -We encourage you to consider this hint: [[Assignment 6 Hint 1]]. + You'll need to define a computation monad type, unit, bind, and lift2. +We encourage you to consider this hint: [[hints/Assignment 6 Hint 1]]. + +
See our [commentary](/hints/assignment_6_commentary) on your solutions.
+ 2. Prove that your monad satisfies the monad laws. First, give examples illustrating specific cases in which the monad laws are