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

**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**

21-127 (Concepts of Mathematics) and
15-112 (Fundamentals of Programming)

**Credits**

This is a 10 unit core course.

**Place and time**

Sundays and Tuesdays | 15:00 to 16:20 | Zoom: 959 0557 3838 | lectures |

**The password for the zoom meeting is on Slack. Make sure you join the course workspace.**

Important
**Online course considerations**

Due to the current COVID-19 pandemic, this course will be held completely
online (the final exam may still be in person, we wait for further
developments). Here are some considerations specific to this course
format:

- No session will be recorded. You are expected to attend all lectures live.
- You are expected to have your video on during all meetings, unless
you have a waiver (more information
__here__). This will make you more committed to the lecture and it improves everyone's experience. - There will be no in person lab sessions. Instead, lab exercises will be released in advance, and there will be a graded individual lab interview every Thursday.
- The format of the midterm will be informed close to the date.