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]].
+We encourage you to consider this hint: [[hints/Assignment 6 Hint 1]].
2. Prove that your monad satisfies the monad laws. First, give
examples illustrating specific cases in which the monad laws are
Ann believes [Bill left].
Ann believes [Cam left].
-We want an analysis on which all four of these sentences can be true
-simultaneously. If sentences denoted simple truth values or booleans,
-we have a problem: if the sentences *Bill left* and *Cam left* are
-both true, they denote the same object, and Ann's beliefs can't
-distinguish between them.
+We want an analysis on which the first three sentences can be true at
+the same time that the last sentence is false. If sentences denoted
+simple truth values or booleans, we have a problem: if the sentences
+*Bill left* and *Cam left* are both true, they denote the same object,
+and Ann's beliefs can't distinguish between them.
The traditional solution to the problem sketched above is to allow
sentences to denote a function from worlds to truth values, what
thing for a monad unit to do.
Then combining a prediction like *left* which is extensional in its
-subject argument with a monadic subject like `unit ann` is simply bind
+subject argument with an intensional subject like `unit ann` is simply bind
in action:
bind (unit ann) left 1;; (* true: Ann left in world 1 *)
arguments of a monoid operation) the two arguments of the bind are of
different types. But it's possible to make the connection between
monads and monoids much closer. This is discussed in [Monads in Category
-Theory](/advanced_notes/monads_in_category_theory).
+Theory](/advanced_topics/monads_in_category_theory).
See also <http://www.haskell.org/haskellwiki/Monad_Laws>.
Here are some papers that introduced monads into functional programming:
There's a long list of monad tutorials on the [[Offsite Reading]] page. Skimming the titles makes us laugh.
In the presentation we gave above---which follows the functional programming conventions---we took `unit`/return and `bind` as the primitive operations. From these a number of other general monad operations can be derived. It's also possible to take some of the others as primitive. The [Monads in Category
-Theory](/advanced_notes/monads_in_category_theory) notes do so, for example.
+Theory](/advanced_topics/monads_in_category_theory) notes do so, for example.
Here are some of the other general monad operations. You don't have to master these; they're collected here for your reference.