15-150: Principles of Functional Programming (Fall 2023)
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
Moreover, you should be able to understand this (do not forget the tooltip).
Pre-requisites
21-127 (Concepts of Mathematics) and
15-112 (Fundamentals of Programming)
Credits
This is a 12 unit core course.
Place and time
Sundays and Tuesdays
14:30 to 15:45
Room 1030
lectures
Thursdays
14:30 to 15:45
Room 1030
homework review
Thursdays
17:15 to 18:30 (15 min per student)
ARC (room 1048)
lab interviews
Class discussions will be on a Discord server, which all students will be invited to by email.
Assessment
Homework: 20%
To be solved individually
The programming part is evaluated on:
Correct type-checking (autograded)
Correct functionality (autograded)
Correct requires and ensures (manually checked)
Comprehensive test cases (manually checked)
Style (manually checked)
The written part is evaluated on:
Correct answer
Clarity, objectiveness, and conciseness
Typesetting (in LaTeX)
Style
The following guidelines are useful for you to avoid losing style points:
The writeup and starter files for each assignment are in a
zip file linked in the schedule below.
Uncompressing this file will create the directory
<asgn>-handout with the starter code and a LaTeX
template.
If you need to download these files again, be
careful not to overwrite your work!
Submitting the Assignments
The handout contains Makefiles to help you organize your
files for submission. Typing make in the code
directory will create the file <asgn>-handin.zip.
Typing make in the latex directory will
compile the LaTeX into a pdf.
If you need help using this Makefile, ask the course staff.
The zip file must contain the solutions for the coding
part. The pdf must contain the solutions for the
written part. It is your responsibility to
ensure that the generated files contain the correct
material.
The zip file needs to be submitted to the coding part of the
assignment on
Gradescope.
It will immediately run a series of tests and give you a
score with some feedback. Make sure to check it! If your code does not
pass all tests, you can submit it again until the deadline. You are limited to a total of 5 submissions
for each assignment.
The pdf file needs to be submitted to the written part of
the assignment on
Gradescope.
Submissions that are in another
format or badly typed will be penalized.
Schedule and deadlines
Tools
SML
The functional programming language we will use for this course is in the
ML
(for Meta-Language) family and it is called SML (Standard ML). There
are different compilers (i.e. implementations) for SML, but your code
will be tested with
Standard ML of New Jersey (or SML/NJ)
version 110.99.3.
On your machine: Go to
http://www.smlnj.org/ to download the
files and follow the installation instruction for your operating system.
Having a local installation is convenient since you will not need to
rely on a good internet connection and you can compile local files
edited in your favorite
text editor.
I recommend vim or
emacs (both can
be used in a terminal, and remember to keep an eye on the status bar at
the bottom of the screen).
On CMU’s machines: All machines should have SML/NJ installed, so you
can use it by simply ssh-ing them (type
ssh your_andrew_id@unix.qatar.cmu.edu
in a terminal and press enter).
If you are using emacs, there is an sml-mode where you can edit your file
and run it interactively. To install, see
http://elpa.gnu.org/packages/sml-mode.html.
Here are a few useful commands (C-x means hit
Ctrl+x):
C-x C-f : open a file (if this is a .sml file and
sml-mode is installed, you should see (SML) on the status bar)
C-space : select a text region
C-x C-c : exit emacs
Additionally, the following commands can be used to interact with the repl
C-c C-l : load the file in an sml repl (first time asks the name of
the sml command used)
C-x ` : find the next error (` is the grave accent key. On my
keyboard layout, I need to press this key + space to actually type it.)
As far as I know, there is no sml integration with vim, but this is a good
text editor which I use on a daily basis. Vim has three main modes:
command, insert or visual. By default, it starts on command mode. You can
enter insert mode (for editing) by typing i and visual mode (for
selecting) by typing v. Hitting ESC will return
to command mode. Here are a few useful commands:
i : enter insert mode
ESC : return to command mode
:w : write file (aka save)
:q : quit vim
As for the rest, you can find a million resources online, so just google
it 😉
LaTeX
Your written assignments will look much better if you develop them in
LaTeX. Typically you will edit a .tex file which is compiled
into a pdf. This file uses specific tags and commands for typesetting. If
you only know Word (or similar) for creating documents, LaTeX takes a
little getting used to, but it is worth it. After you become familiar with
the syntax, some advantages are:
Typing math is much (much, much) faster
You do not have to worry about margins or consistent style of
headers or alignment
Changing the order of sections involves no renumbering on your part
References are formatted and numbered for you (APA? What is that?)
There are various tools for editing and compiling LaTeX. If you do not
want to install anything locally, you can use one of the web-based ones,
such as Overleaf. If
you use one of those tools, upload all files in the latex
directory of the handout.
Examples on how to typeset some of the course constructs can be found in
this LaTeX guide.
If you want to know what is the LaTeX name for a symbol, you can use Detexify.
If you have not memorized all symbols yet, Mathcha can help you type
math.
Collaboration is regulated by the whiteboard policy: you can bounce
ideas about a homework with other students, but when it comes to typing
it down for submission, you are on your own. You are not allowed to use
notes, files, pictures, etc, from any previous discussion nor previous
versions of this course.
And remember not to ignore your inner voice when it says “That’s
probably not the best decision...”.
An Invitation to Students with Learning Disabilities:
Carnegie Mellon University is committed to providing reasonable
accommodations for all persons with disabilities. To access
accommodation services you are expected to initiate the request and
submit a Voluntary Disclosure of Disability Form to the office of Health
& Wellness or CaPS-Q. In order to receive services/accommodations,
verification of a disability is required as recommended in writing by a
doctor, licensed psychologist or psycho-educational specialist. The
office of Health & Wellness, CaPS-Q and Office of Disability Resources
in Pittsburgh will review the information you provide. All information
will be considered confidential and only released to appropriate persons
on a need to know basis.
Once the accommodations have been approved, you will be issued a Summary
of Accommodations Memorandum documenting the disability and describing
the accommodation. You are responsible for providing the Memorandum to
your professors at the beginning of each semester.
Take Care of Yourself:
Do your best to maintain a healthy lifestyle this semester by eating
well, exercising, getting enough sleep and taking some time to relax.
This will help you achieve your goals and cope with stress.
All of us benefit from support during times of struggle. You are not
alone. There are many helpful resources available on campus and an
important part of the college experience is learning how to ask for
help. Asking for support sooner rather than later is often helpful.
If you or anyone you know experiences any academic stress, difficult
life events, or feelings like anxiety or depression, we strongly
encourage you to seek support. Counseling and Psychological Services
(CaPS-Q) is here to help: call 4454 8525 or make an appointment to see
the counselor by emailing
student-counselling@qatar.cmu.edu.
Consider reaching out to a friend, faculty or family member you trust
for help.
If you or someone you know is feeling suicidal or in danger of
self-harm, call someone immediately, day or night at 5554 7913. If the
situation is life threatening, call 999.