bc8dc8eff4a28cd9cd62865c7becf04ec6ca9e23
[lambda.git] / week7.mdwn
1 [[!toc]]
2
3 Monads
4 ------
5
6 Start by (re)reading the discussion of monads in the lecture notes for
7 week 6 [Towards Monads](http://lambda.jimpryor.net//week6/#index4h2).
8 In those notes, we saw a way to separate thining about error
9 conditions (such as trying to divide by zero) from thinking about
10 normal arithmetic computations.  We did this by making use of the
11 Option monad: in each place where we had something of type `int`, we
12 put instead something of type `int option`, which is a sum type
13 consisting either of just an integer, or else some special value which
14 we could interpret as signaling that something had gone wrong.
15
16 The goal was to make normal computing as convenient as possible: when
17 we're adding or multiplying, we don't have to worry about generating
18 any new errors, so we do want to think about the difference between
19 ints and int options.  We tried to accomplish this by defining a
20 `bind` operator, which enabled us to peel away the option husk to get
21 at the delicious integer inside.  There was also a homework problem
22 which made this even more convenient by mapping any bindary operation
23 on plain integers into a lifted operation that understands how to deal
24 with int options in a sensible way.
25
26 [Linguitics note: Dividing by zero is supposed to feel like a kind of
27 presupposition failure.  If we wanted to adapt this approach to
28 building a simple account of presupposition projection, we would have
29 to do several things.  First, we would have to make use of the
30 polymorphism of the `option` type.  In the arithmetic example, we only
31 made use of int options, but when we're composing natural language
32 expression meanings, we'll need to use types like `N int`, `Det Int`,
33 `VP int`, and so on.  But that works automatically, because we can use
34 any type for the `'a` in `'a option`.  Ultimately, we'd want to have a
35 theory of accommodation, and a theory of the situations in which
36 material within the sentence can satisfy presuppositions for other
37 material that otherwise would trigger a presupposition violation; but,
38 not surprisingly, these refinements will require some more
39 sophisticated techniques than the super-simple option monad.]
40
41 So what examctly is a monad?  As usual, we're not going to be pedantic
42 about it, but for our purposes, we can consider a monad to be a system
43 that provides at least the following three elements:
44
45 * A way to build a complex type from some basic type.  In the division
46   example, the polymorphism of the `'a option` type provides a way of
47   building an option out of any other type of object.  People often
48   use a container metaphor: if `x` has type `int option`, then `x` is
49   a box that (may) contain an integer.
50
51     `type 'a option = None | Some of 'a;;`
52
53 * A way to turn an ordinary value into a monadic value.  In Ocaml, we
54   did this for any integer n by mapping an arbitrary integer `n` to
55   the option `Some n`.  To be official, we can define a function
56   called unit:
57
58     `let unit x = Some x;;`
59
60     `val unit : 'a -> 'a option = <fun>`
61
62     So `unit` is a way to put something inside of a box.
63
64 * A bind operation (note the type):
65
66      `let bind m f = match m with None -> None | Some n -> f n;;`
67
68      `val bind : 'a option -> ('a -> 'b option) -> 'b option = <fun>`
69
70      `bind` takes two arguments (a monadic object and a function from
71      ordinary objects to monadic objects), and returns a monadic
72      object.
73
74      Intuitively, the interpretation of what `bind` does is like this:
75      the first argument computes a monadic object m, which will
76      evaluate to a box containing some ordinary value, call it `x`.
77      Then the second argument uses `x` to compute a new monadic
78      value.  Conceptually, then, we have
79
80     `let bind m f = (let x = unwrap m in f x);;`
81
82     The guts of the definition of the `bind` operation amount to
83     specifying how to unwrap the monadic object `m`.  In the bind
84     opertor for the option monad, we unwraped the option monad by
85     matching the monadic object `m` with `Some n`--whenever `m`
86     happend to be a box containing an integer `n`, this allowed us to
87     get our hands on that `n` and feed it to `f`.
88
89 So the "Option monad" consists of the polymorphic option type, the
90 unit function, and the bind function.  
91
92 A note on notation: some people use the infix operator `>==` to stand
93 for `bind`.  I really hate that symbol.  Following Wadler, I prefer to
94 infix five-pointed star, or on a keyboard, `*`.
95
96
97 The Monad laws
98 --------------
99
100 Just like good robots, monads must obey three laws designed to prevent
101 them from hurting the people that use them or themselves.
102
103 *    Left identity: unit is a left identity for the bind operation.
104      That is, for all `f:'a -> 'a M`, where `'a M` is a monadic
105      object, we have `(unit x) * f == f x`.  For instance, `unit` is a
106      function of type `'a -> 'a option`, so we have
107
108 <pre>
109 # let ( * ) m f = match m with None -> None | Some n -> f n;;
110 val ( * ) : 'a option -> ('a -> 'b option) -> 'b option = <fun>
111 # let unit x = Some x;;
112 val unit : 'a -> 'a option = <fun>
113 # unit 2 * unit;;
114 - : int option = Some 2
115 </pre>
116
117 The parentheses is the magic for telling Ocaml that the
118 function to be defined (in this case, the name of the function
119 is `*`, pronounced "bind") is an infix operator, so we write
120 `m * f` or `( * ) m f` instead of `* m f`.
121
122 *    Associativity: bind obeys a kind of associativity, like this:
123
124     `(m * f) * g == m * (fun x -> f x * g)`
125
126     If you don't understand why the lambda form is necessary (the "fun
127     x" part), you need to look again at the type of bind.
128
129     For an illustration of associativity in the option monad:
130
131 <pre>
132 Some 3 * unit * unit;; 
133 - : int option = Some 3
134 Some 3 * (fun x -> unit x * unit);;
135 - : int option = Some 3
136 </pre>
137
138 Of course, associativity must hold for arbitrary functions of
139 type `'a -> M 'a`, where `M` is the monad type.  It's easy to
140 convince yourself that the bind operation for the option monad
141 obeys associativity by dividing the inputs into cases: if `m`
142 matches `None`, both computations will result in `None`; if
143 `m` matches `Some n`, and `f n` evalutes to `None`, then both
144 computations will again result in `None`; and if the value of
145 `f n` matches `Some r`, then both computations will evaluate
146 to `g r`.
147
148 *    Right identity: unit is a right identity for bind.  That is, 
149      `m * unit == m` for all monad objects `m`.  For instance,
150
151 <pre>
152 # Some 3 * unit;;
153 - : int option = Some 3
154 </pre>
155
156 Now, if you studied algebra, you'll remember that a *monoid* is an
157 associative operation with a left and right identity.  For instance,
158 the natural numbers along with multiplication form a monoid with 1
159 serving as the left and right identity.  That is, temporarily using
160 `*` to mean arithmetic multiplication, `1 * n == n == n * 1` for all
161 `n`, and `(a * b) * c == a * (b * c)` for all `a`, `b`, and `c`.  As
162 presented here, a monad is not exactly a monoid, because (unlike the
163 arguments of a monoid operation) the two arguments of the bind are of
164 different types.  But if we generalize bind so that both arguments are
165 of type `'a -> M 'a`, then we get plain identity laws and
166 associativity laws, and the monad laws are exactly like the monoid
167 laws (see <http://www.haskell.org/haskellwiki/Monad_Laws>, near the bottom).
168
169
170 Monad outlook
171 -------------
172
173 We're going to be using monads for a number of different things in the
174 weeks to come.  The first main application will be the State monad,
175 which will enable us to model mutation: variables whose values appear
176 to change as the computation progresses.  Later, we will study the
177 Continuation monad.
178
179 The intensionality monad
180 ------------------------
181
182 In the meantime, we'll see a linguistic application for monads:
183 intensional function application.  In Shan (2001) [Monads for natural
184 language semantics](http://arxiv.org/abs/cs/0205026v1), Ken shows that
185 making expressions sensitive to the world of evaluation is
186 conceptually the same thing as making use of a *reader monad* (which
187 we'll see again soon).  This technique was beautifully re-invented
188 by Ben-Avi and Winter (2007) in their paper [A modular
189 approach to
190 intensionality](http://parles.upf.es/glif/pub/sub11/individual/bena_wint.pdf),
191 though without explicitly using monads.
192
193 All of the code in the discussion below can be found here: [[intensionality-monad.ml]].
194 To run it, download the file, start Ocaml, and say 
195
196     # #use "intensionality-monad.ml";;
197
198 Note the extra `#` attached to the directive `use`.
199
200 Here's the idea: since people can have different attitudes towards
201 different propositions that happen to have the same truth value, we
202 can't have sentences denoting simple truth values.  If we did, then if John
203 believed that the earth was round, it would force him to believe
204 Fermat's last theorem holds, since both propositions are equally true.
205 The traditional solution is to allow sentences to denote a function
206 from worlds to truth values, what Montague called an intension.  
207 So if `s` is the type of possible worlds, we have the following
208 situation:
209
210
211 <pre>
212 Extensional types                 Intensional types       Examples
213 -------------------------------------------------------------------
214
215 S         s->t                    s->t                    John left
216 DP        s->e                    s->e                    John
217 VP        s->e->t                 s->(s->e)->t            left
218 Vt        s->e->e->t              s->(s->e)->(s->e)->t    saw
219 Vs        s->t->e->t              s->(s->t)->(s->e)->t    thought
220 </pre>
221
222 This system is modeled on the way Montague arranged his grammar.
223 There are significant simplifications: for instance, determiner
224 phrases are thought of as corresponding to individuals rather than to
225 generalized quantifiers.  If you're curious about the initial `s`'s
226 in the extensional types, they're there because the behavior of these
227 expressions depends on which world they're evaluated at.  If you are
228 in a situation in which you can hold the evaluation world constant,
229 you can further simplify the extensional types.  Usually, the
230 dependence of the extension of an expression on the evaluation world
231 is hidden in a superscript, or built into the lexical interpretation
232 function.
233
234 The main difference between the intensional types and the extensional
235 types is that in the intensional types, the arguments are functions
236 from worlds to extensions: intransitive verb phrases like "left" now
237 take intensional concepts as arguments (type s->e) rather than plain
238 individuals (type e), and attitude verbs like "think" now take
239 propositions (type s->t) rather than truth values (type t).
240
241 The intenstional types are more complicated than the intensional
242 types.  Wouldn't it be nice to keep the complicated types to just
243 those attitude verbs that need to worry about intensions, and keep the
244 rest of the grammar as extensional as possible?  This desire is
245 parallel to our earlier desire to limit the concern about division by
246 zero to the division function, and let the other functions, like
247 addition or multiplication, ignore division-by-zero problems as much
248 as possible.
249
250 So here's what we do:
251
252 In Ocaml, we'll use integers to model possible worlds:
253
254     type s = int;;
255     type e = char;;
256     type t = bool;;
257
258 Characters (characters in the computational sense, i.e., letters like
259 `'a'` and `'b'`, not Kaplanian characters) will model individuals, and
260 Ocaml booleans will serve for truth values.
261
262 <pre>
263 type 'a intension = s -> 'a;;
264 let unit x (w:s) = x;;
265
266 let ann = unit 'a';;
267 let bill = unit 'b';;
268 let cam = unit 'c';;
269 </pre>
270
271 In our monad, the intension of an extensional type `'a` is `s -> 'a`,
272 a function from worlds to extensions.  Our unit will be the constant
273 function (an instance of the K combinator) that returns the same
274 individual at each world.
275
276 Then `ann = unit 'a'` is a rigid designator: a constant function from
277 worlds to individuals that returns `'a'` no matter which world is used
278 as an argument.
279
280 Let's test compliance with the left identity law:
281
282 <pre>
283 # let bind m f (w:s) = f (m w) w;;
284 val bind : (s -> 'a) -> ('a -> s -> 'b) -> s -> 'b = <fun>
285 # bind (unit 'a') unit 1;;
286 - : char = 'a'
287 </pre>
288
289 We'll assume that this and the other laws always hold.
290
291 We now build up some extensional meanings:
292
293     let left w x = match (w,x) with (2,'c') -> false | _ -> true;;
294
295 This function says that everyone always left, except for Cam in world
296 2 (i.e., `left 2 'c' == false`).
297
298 Then the way to evaluate an extensional sentence is to determine the
299 extension of the verb phrase, and then apply that extension to the
300 extension of the subject:
301
302 <pre>
303 let extapp fn arg w = fn w (arg w);;
304
305 extapp left ann 1;;
306 # - : bool = true
307
308 extapp left cam 2;;
309 # - : bool = false
310 </pre>
311
312 `extapp` stands for "extensional function application".
313 So Ann left in world 1, but Cam didn't leave in world 2.
314
315 A transitive predicate:
316
317     let saw w x y = (w < 2) && (y < x);;
318     extapp (extapp saw bill) ann 1;; (* true *)
319     extapp (extapp saw bill) ann 2;; (* false *)
320
321 In world 1, Ann saw Bill and Cam, and Bill saw Cam.  No one saw anyone
322 in world two.
323
324 Good.  Now for intensions:
325
326     let intapp fn arg w = fn w arg;;
327
328 The only difference between intensional application and extensional
329 application is that we don't feed the evaluation world to the argument.
330 (See Montague's rules of (intensional) functional application, T4 -- T10.)
331 In other words, instead of taking an extension as an argument,
332 Montague's predicates take a full-blown intension.  
333
334 But for so-called extensional predicates like "left" and "saw", 
335 the extra power is not used.  We'd like to define intensional versions
336 of these predicates that depend only on their extensional essence.
337 Just as we used bind to define a version of addition that interacted
338 with the option monad, we now use bind to intensionalize an
339 extensional verb:
340
341 <pre>
342 let lift pred w arg = bind arg (fun x w -> pred w x) w;;
343
344 intapp (lift left) ann 1;; (* true: Ann still left in world 1 *)
345 intapp (lift left) cam 2;; (* false: Cam still didn't leave in world 2 *)
346 </pre>
347
348 Because `bind` unwraps the intensionality of the argument, when the
349 lifted "left" receives an individual concept (e.g., `unit 'a'`) as
350 argument, it's the extension of the individual concept (i.e., `'a'`)
351 that gets fed to the basic extensional version of "left".  (For those
352 of you who know Montague's PTQ, this use of bind captures Montague's
353 third meaning postulate.)
354
355 Likewise for extensional transitive predicates like "saw":
356
357 <pre>
358 let lift2 pred w arg1 arg2 = 
359   bind arg1 (fun x -> bind arg2 (fun y w -> pred w x y)) w;;
360 intapp (intapp (lift2 saw) bill) ann 1;;  (* true: Ann saw Bill in world 1 *)
361 intapp (intapp (lift2 saw) bill) ann 2;;  (* false: No one saw anyone in world 2 *)
362 </pre>
363
364 Crucially, an intensional predicate does not use `bind` to consume its
365 arguments.  Attitude verbs like "thought" are intensional with respect
366 to their sentential complement, but extensional with respect to their
367 subject (as Montague noticed, almost all verbs in English are
368 extensional with respect to their subject; a possible exception is "appear"):
369
370 <pre>
371 let think (w:s) (p:s->t) (x:e) = 
372   match (x, p 2) with ('a', false) -> false | _ -> p w;;
373 </pre>
374
375 Ann disbelieves any proposition that is false in world 2.  Apparently,
376 she firmly believes we're in world 2.  Everyone else believes a
377 proposition iff that proposition is true in the world of evaluation.
378
379 <pre>
380 intapp (lift (intapp think
381                      (intapp (lift left)
382                              (unit 'b'))))
383        (unit 'a') 
384 1;; (* true *)
385 </pre>
386
387 So in world 1, Ann thinks that Bill left (because in world 2, Bill did leave).
388
389 The `lift` is there because "think Bill left" is extensional wrt its
390 subject.  The important bit is that "think" takes the intension of
391 "Bill left" as its first argument.
392
393 <pre>
394 intapp (lift (intapp think
395                      (intapp (lift left)
396                              (unit 'c'))))
397        (unit 'a') 
398 1;; (* false *)
399 </pre>
400
401 But even in world 1, Ann doesn't believe that Cam left (even though he
402 did: `intapp (lift left) cam 1 == true`).  Ann's thoughts are hung up
403 on what is happening in world 2, where Cam doesn't leave.
404
405 *Small project*: add intersective ("red") and non-intersective
406  adjectives ("good") to the fragment.  The intersective adjectives
407  will be extensional with respect to the nominal they combine with
408  (using bind), and the non-intersective adjectives will take
409  intensional arguments.
410
411 Finally, note that within an intensional grammar, extensional funtion
412 application is essentially just bind:
413
414 <pre>
415 # let swap f x y = f y x;;
416 # bind cam (swap left) 2;;
417 - : bool = false
418 </pre>