Aims:

This course explores the functional programming paradigm and the implementation technology for functional programming languages. It aims to develop a broad understanding of the functional programming style and recursive programming techniques using the language Miranda, together with an understanding of implementation issues that are relevant not only to functional languages but also to other systems that require automatic dynamic memory management. The course explores the underlying mechanics of strict and lazy functional languages; it does not use Haskell or F# or OOCAML and does not aim to provide training in such languages, though an introduction to Miranda is provided and students are expected to improve their functional programming skills through independent study. In the second half of the course students are expected to use independent study to read extensively about implementation issues which are then discussed in the lectures.Learning outcomes:

On successful completion of the module, a student will be able to (at a level commensurate with FHEQ level 6):

Understand the basics of the lambda calculus and combinators and how they are used in the implementation of functional languages.
	Understand the main features of a lazy functional language.
	Understand type checking, type-inference and the operation of the Miranda (Hindley-Milner) type system.
	Write and understand non-trivial functional programs in Miranda.
	Understand the computation and memory management issues affecting the sequential implementation of lazy functional languages.
	Solve problems relating to any aspect of the module's syllabus, under examination conditions.
Content:

Classification of programming languages:
	Distinctive features of Functional Programming Languages.
	
	The Lambda Calculus and Combinators:
	Versions of the Lambda Calculus.
		Syntax and semantics.
		Reduction orders, strong normalisation.
		Combinators and computationally complete sets.
	
	Introduction to Miranda:
	Programming environment.
		Types and simple polymorphic types.
		Recursion.
		Pattern-matching.
		Lists.
		Higher-Order functions.
		User-defined types.
	
	Type polymorphism and type systems.
	Recursive programming techniques.
	Introduction to implementation techniques:
	Strict evaluation and lazy evaluation.
		The need for automatic memory management.
	
	Automatic memory management:
	Memory allocation and garbage collection.
		Garbage collection techniques.
	
Requisites:

To be eligible to select the undergraduate (FHEQ level 6) delivery of this module as optional or elective, a student must be registered on a programme and year of study for which it is formally available.

To be eligible to select the taught postgraduate (FHEQ level 7) delivery of this module as optional or elective, a student must both: (1) be registered on a programme of study for which it is formally available; and (2) have either taken all term 1 modules of the MSc Computer Science programme at UCL or have studied the following at FHEQ level 6 or higher:

Programming in one high-level programming language and one assembly language.
	Formal systems of logic such as Boolean algebra, propositional logic or predicate calculus.
	Virtual machines, virtual memory and memory paging.
	Compilers, including lexical analysis, parsing and code generation.
	Dynamic data structures and abstract data types.
	Models of storage in computer systems.
	Algorithmic complexity.
Students must be proficient in the English language to UCL's "Good" standard or better.