mpri-funcprog-project/README.md
2017-09-21 22:09:04 +02:00

8.4 KiB

Functional programming and type systems (2017-2018)

This page supplements the official page of MPRI 2-4.

Location and duration

The lectures take place at University Paris 7 - Denis Diderot, Bâtiment Sophie Germain, in room 2035.

They are scheduled on Fridays from 12:45 to 15:30. There is a 15-minute break in the middle of each lecture.

Teachers

Aims

This course presents the principles and formalisms that underlie many of today's typed functional programming languages. (Here are some introductory slides.)

The course is made up of four parts and can be split after the first two parts.

In the first part, we discuss the operational semantics of functional programming languages, and we present several classic program transformations, including closure conversion, defunctionalization, and the transformation into continuation-passing style (CPS). These program transformations are interesting from two points of view. First, they are useful programming techniques, which can help write or understand programs. Second, they are used in the compilation of functional programming languages, so they help understand what happens when the machine executes a program. We use operational semantics to prove that the meaning of programs is preserved by these transformations. Finally, we suggest how these definitions and theorems can be expressed in a form that a machine can check. That is, although Coq is not a prerequisite of the course, we will at least try to read and understand Coq definitions and statements.

In the second part, we focus on the meta-theoretical properties of type systems. We study parametric polymorphism (as in System F and ML), data types and type abstraction. We show syntactic type soundness (via progress and subject reduction) by reasoning by induction on typing derivations. We also show how to obtain semantic properties via logical relations by reasoning by induction on the structure of types. Finally, we introduce subtyping, row polymorphism, and illustrate the problems induced by side effects (references) and the need for the value restriction.

The third part of the course describes more advanced features of type systems: exceptions and effect handlers, including their typechecking and static analyses: type inference, data flow and control flow analyses. Finally, it introduces dependent types and refinement types.

The last part focuses on the use of dependent types for programming: effectful programming with monads and algebraic effects; tagless interpreters; programming with total functions; generic programming. We also show the limits of dependently-typed functional programming.

Approximate syllabus

Functional Programming: Under the Hood

  • (22/09/2017) Introduction (slides 00). Syntax and operational semantics, on paper and on a machine (slides 01a) (slides 01b) (Coq demo).
  • (29/09/2017) From a small-step semantics down to an efficient interpreter, in several stages.
  • (06/10/2017) Compiling away first-class functions: closure conversion, defunctionalization.
  • (13/10/2017) Compiling away the call stack: the CPS transformation.
  • (20/10/2017) Equational reasoning and program optimizations.

Metatheory of Typed Programming Languages

  • (15/09/2017) Metatheory of System F (See also intro, and chap 1 and 2 of course notes)
  • (27/10/2017) ADTs, existential types, GADTs.
  • (03/11/2017) Logical relations.
  • (10/11/2017) Subtyping. Rows.
  • (17/11/2017) References, Value restriction, Side effects.

Advanced Aspects of Type Systems

  • Exceptions and effect handlers. (Compiled away via CPS.)
  • Typechecking exceptions and handlers.
  • Type inference. (ML. Bidirectional. Elaboration.)
  • Data/control flow analysis.
  • Functional correctness. Intro to dependent/refinement types.

Dependently-typed Functional Programming

  • Effectful functional programming.
  • Dependent functional programming.
  • Total functional programming.
  • Generic functional programming.
  • Open problems in dependent functional programming.

Evaluation of the course

Two written exams (a partial and a final exam) and one programming project or several programming exercises are used to evaluate the students that follow the full course. Only the partial exam will count to grade students who split the course.

Although the course has changed, you may still have a look at previous exams available with solutions:

Please install opam first.

Then, install OCaml 4.0x and Coq 8.5 via the following commands:

opam init --comp=4.05 # for instance
opam repo add coq-released https://coq.inria.fr/opam/released
opam update
opam install -j4 -v coq.8.5.3

(Do not install Coq 8.6. The version of AutoSubst that I am using is not compatible with it. If for some reason you need Coq 8.6, or have already installed Coq 8.6, note that opam switch can be used to let multiple versions of Coq coexist.)

Please also install François Pottier's variant of the AutoSubst library:

git clone git@github.com:fpottier/autosubst.git
make -C autosubst install

In order to use Coq inside emacs, ProofGeneral is highly recommended. Here is a suggested installation script:

rm -rf /tmp/PG
cd /tmp
git clone git@github.com:ProofGeneral/PG.git
cd PG
EMACS=/Applications/Aquamacs.app/Contents/MacOS/Aquamacs
if [ ! -x $EMACS ]; then
  EMACS=emacs
fi
make EMACS=$EMACS compile
TARGET=/usr/local/share/emacs/site-lisp/ProofGeneral
sudo rm -rf $TARGET
sudo mv /tmp/PG $TARGET

Enable ProofGeneral by adding the following line to your .emacs file:

(load-file "/usr/local/share/emacs/site-lisp/ProofGeneral/generic/proof-site.el")

If desired, ProofGeneral can be further customized.

Bibliography

Types and Programming Languages, Benjamin C. Pierce, MIT Press, 2002.

Advanced Topics in Types and Programming Languages, Edited by Benjamin C. Pierce, MIT Press, 2005.