| ![]() |
The essence of functional programming
Philip Wadler, University of Glasgow?
Abstract
This paper explores the use monads to structure functional programs. No prior knowledge of monads or category theory is required.
Monads increase the ease with which programs may be modified. They can mimic the effect of impure features such as exceptions, state, and continuations; and also provide effects not easily achieved with such features. The types of a program reflect which effects occur.
The first section is an extended example of the use of monads. A simple interpreter is modified to support various extra features: error messages, state, output, and non-deterministic choice. The second section describes the relation between monads and continuation-passing style. The third section sketches how monads are used in a compiler for Haskell that is written in Haskell.
1 Introduction
Shall I be pure or impure?
Pure functional languages, such as Haskell or Miranda, offer the power of lazy evaluation and the simplicity of equational reasoning. Impure functional languages, such as Standard ML or Scheme, offer a tempting spread of features such as state, exception handling, or continuations.
One factor that should influence my choice is the ease with which a program can be
modified. Pure languages ease change by making manifest the data upon which each
operation depends. But, sometimes, a seemingly small change may require a program in
a pure language to be extensively restructured, when judicious use of an impure feature
may obtain the same effect by altering a mere handful of lines.
Say I write an interpreter in a pure functional language.
To add error handling to it, I need to modify the result type to include error values,
and at each recursive call to check for and handle errors appropriately. Had I used an
impure language with exceptions, no such restructuring would be needed.
?Author's address: Department of Computing Science, University of Glasgow, Glasgow G12 8QQ, Scotland. E-mail: [email protected].
To be presented as an invited talk at 19'th Annual Symposium on Principles of Programming Languages, Santa Fe, New Mexico, January 1992. This version differs slightly from the conference proceedings.