Monads are used in theoretical computer science to give denotational semantics to pro- grams with side effects. For instance, we might write a program that takes two numerical arguments and eventually returns their sum. In this case we would say the program has a main effect modeled by addition. But along the way, the program may request input from the user, print a value to the screen, rewrite the value of a global variable, or any combination of the above. Monads provide an analytical tool that allows us to capture the effects that these different kinds of computations may have on the environment in which they are run, without losing sight of what they have in common: a function from two numbers to their sum. The course will introduce the basics of monads | including type constructors, unit and bind operators, and the monad laws | by developing progressively more complex concrete fragments of natural language in Haskell.