Skip to main content

Functional Programming:  2023-2024



Preliminary ExaminationsComputer Science and Philosophy

Preliminary ExaminationsComputer Science

Preliminary ExaminationsMathematics and Computer Science



This is a first course in programming. It makes use of a programming language called Haskell, in which programs can be viewed as mathematical functions. This makes the language very powerful, so that we can easily construct programs that would be difficult or very large in other languages.

An important theme of the course is how to apply mathematical reasoning to programs, so as to prove that a program performs its task correctly, or to derive it by algebraic manipulation from a simpler but less efficient program for the same problem.

The course provides hands-on experience of programming through two lab exercises: the first one aims to make you acquainted with the mechanics of writing Haskell programs, and the second one tackles a more challenging programming task.

Learning outcomes

At the end of the course the student will be able to:

  1. Write programs in a functional style;
  2. Reason formally about functional programs;
  3. Use polymorphism and higher-order functions;
  4. Reason informally about the time and space complexity of programs.


  • Programming by writing functions: expressions, values, types, evaluation. Function definitions in Haskell scripts, interactive sessions. Mathematical functions as programs, function application as program execution; lists for sequencing, and function composition as a program structuring tool.
  • Strong typing. Basic types, constructed types (sums and products); constructors, selectors, and discriminators; definitions by pattern matching. Parametric polymorphism, type classes and ad-hoc polymorphism; recursive types. Lists, finite and infinite lists; list comprehensions, standard list functions including map, filter, concat.
  • Evaluation as computation, evaluation order; recursive definitions, non-termination and an outline of the idea of computability. Sorting as an example; the concept of efficiency of evaluation, and the asymptotic complexity of a calculation.
  • Sudoku solver as an example; the idea of infeasibly inefficient algorithms.
  • Proofs by induction. The take lemma, induction on finite lists, induction on infinite lists. The notion of chain completeness.
  • Folds on data structures. Left- and right- folds on lists.  Fold fusion.  Standard functions as instances of folds. Scans as folds. Unfolds. Writing programs by solving equations for unknown functions.
  • Efficiency improvement techniques involving accumulating parameters. Associativity and the relationship between left- and right-folds. Log time exponentiation.
  • Countdown as an example. Abstract syntax trees. Tabulation and dynamic programming.
  • Parsers as an example. The idea of parser combinators, as an introduction to monads. The do notation.


Principles of functional programming: expressions, evaluations, functions, and types. Type definitions and built-in types: numbers, characters, strings and lists. Basic operations on lists, including map, fold and filter, together with their algebraic properties. Recursive definitions and structural induction. Simple program calculation. Infinite lists and their uses. Further data structures: binary trees, general trees. Use of trees for representing sets and symbolic data. Normal order reduction and lazy evaluation. Simple cost models for functional programs; time and space complexity.

Reading list

Course text:

Either of

  • Graham Hutton, Programming in Haskell (2nd edition), Cambridge University Press, 2016.
  • Richard Bird, Introduction to Functional Programming using Haskell, second edition, Prentice-Hall International, 1998.

Background Reading:


Students are formally asked for feedback at the end of the course. Students can also submit feedback at any point here. Feedback received here will go to the Head of Academic Administration, and will be dealt with confidentially when being passed on further. All feedback is welcome.

Taking our courses

This form is not to be used by students studying for a degree in the Department of Computer Science, or for Visiting Students who are registered for Computer Science courses

Other matriculated University of Oxford students who are interested in taking this, or other, courses in the Department of Computer Science, must complete this online form by 17.00 on Friday of 0th week of term in which the course is taught. Late requests, and requests sent by email, will not be considered. All requests must be approved by the relevant Computer Science departmental committee and can only be submitted using this form.