## 15-150: Principles of Functional Programming (Fall 2019)

**Overview**

The purpose of this course is to introduce *functional programming*.
Saying that this is another "programming paradigm" is an understatement.
Instead, think of functional programming as a different way to understand
computation, one coming from a mathematical perspective. This has
interesting implications.
First of all, programs become more structured objects, which facilitates
reasoning about their correctness. We will see how to apply the well-know
principle of induction to do that.
Learning how to implement programs with this particular mathematical
structure will change the way we solve problems. We will learn how to
decompose problems in smaller parts and use these parts to compose a
solution. This approach results in natural and elegant solutions for many
computer science problems.

**Learning goals**

Upon completion of this course, students will have acquired a mastery of
basic functional programming techniques, including the design of programs
using types, the development of programs using mathematical techniques for
verification and analysis, the use of abstract types and modules to
structure code, and the exploitation of parallelism in applications.

In particular, a student taking this course will learn to:

- Write well-typed functional programs using the language ML
- Develop specifications and prove program correctness using rigorous techniques
- Apply equational, evaluational, and compositional reasoning techniques, and use mathematical and structural induction in proofs
- Analyze sequential and parallel running time of programs using the concepts of work and span
- Develop cost graphs and recurrences from programs, and use them to derive asymptotic bounds on work and span
- Use abstract types and modules to structure code with clear and well-designed interfaces
- Identify opportunities for parallelism in code and exploit parallelism by choosing appropriate data structures and function designs

__this__(do not forget the tooltip).

**Pre-requisites**

You must have completed 21-127 (Concepts of Mathematics) and 15-112
(Fundamentals of Programming) to attend this course.

**Credits**

This is a 10 unit core course.

**Place and time**

Sundays and Tuesdays | 15:00 to 16:20 | CMB 1190 | lectures |

Thursdays | 15:00 to 16:20 | CMB 1032 | labs |