15-150: Functional Programming, Summer 2018


There is no required textbook for the course. All material we expect you to be familiar with will be covered in sufficient detail in the lectures and lecture notes. There is an optional (and free!) text which some students find useful, called Programming In Standard ML (PSML). This book is based on the lecture notes for the predecessor to this course, 15-212.


We have set up an instance of Piazza to communicate with you. We will use this to answer questions about the assignments, allow for students to discuss course material, and make announcements about the class. You are responsible for being current with the information and discussions that are posted there.

If you have a question that is inappropriate to ask in public ("Here's my attempt at a solution; I'm stuck on..."), please come to office hours.

You will get an email from Piazza with a link inviting you to create an account within the first week of the term. If you haven't gotten one in that time, please contact course staff.

In addition to the web interface, there are Piazza apps for Android and iOS available for free through their respective app stores.


We will use a git repository to distribute files to you this semester. Instructions on how to use it are available here.

SML Style Guide

Here is a style guide to help you write clean, clear, and concise SML. You should follow it closely and feel free to ask for clarifications. (Remember, "style points" are part of your homework grade!)

Guide to Extensional Equivalence

We have collected the rules for reasoning about extensional equivalence into a guide.


You can find a reference for the sequence library here.

Proof Guidelines

Here is a proof guideline document to make it clearer as to what we look for in proofs for this class. Keep in mind that this is just a guideline, meaning that following every point laid out here will not guarantee you a 100% on your proofs, but it should be a nice place to get started.


We require that you turn in your written homework assignments as a typeset PDF. There are many ways to create such a PDF, and you may use whichever one you feel comfortable with, but LaTeX is one of the best solutions.

LaTeX is built from Don Knuth's TeX typesetting language, and has grown through community support to be both extremely powerful and easy to use. LaTeX is installed on the Andrew UNIX servers, and can be downloaded and installed on local machines as well. There are any number of excellent resources about how to use LaTeX; a few are listed here for your convenience.

LaTeX source files can be created with any text editor, so emacs and vim are excellent choices. There are several LaTeX specific IDEs that you may find more comfortable to use, depending on your working environment:

We have produced a simple file that shows off many of LaTeX's more helpful features in both source and pdf.


An official installation of SML of New Jersey (sml/nj) can be run from the Andrew Unix servers at unix.andrew.cmu.edu. They are running version 110.78. All of your submissions for the class should compile on the unix machines.

sml/nj can be run from the command 'sml' in your shell. Alternatively, we have set up a macro 'smlnj' in /afs/andrew/course/15/150/bin that automatically wraps this with rlwrap, a convenient utility that allows you to use the arrow keys to go back and forth on a line and traverse your command history.

If you want a local copy of sml/nj, one can be acquired from the sml/nj website. There is source code available there, as well as platform-specific installation instructions. If you are running a distribution of Linux, there is a decent chance that you can find sml/nj in your package manager, though the version may or may not be the same as the one on the unix machines. If you end up doing this, we encourage you to make sure your code compiles on the unix machines before submitting it.

Andrew UNIX

Your Andrew ID gives you access to the UNIX servers via SSH. To use them, SSH to unix.andrew.cmu.edu with the SSH client of your choice. SSH ships with OS X, and can be accessed via the terminal; almost all distributions of Linux also ship with SSH or have it available through their package managers; putty is an excellent SSH client for windows users.

Once you have connected to one of the UNIX servers, you will be presented with a shell prompt, and you can work from there. The Computing Services documentation on how to use Andrew UNIX may be helpful.

Text Editors

SML is best written in a text editor. There are IDE modes for large IDEs like Eclipse, but they are typically more trouble than they're worth. Emacs and Vim are the two clear choices for text editors in a modern UNIX environment. Rather than get into the question of which one is better, we'll give some guidance for how to use both here. Both are very mature and stable projects that provide largely the same functionality. Which of the two you prefer is entirely a question of taste.

GNU emacs

The guiding principle of emacs philosophy is that you should never have to leave emacs to perform a task if you don't want to. If you're writing C, it can run your makefile, and show you GDB output internally. It even has tetris and email clients built in. Despite being extremely large in this sense, emacs scales down to the smallest of text files elegantly.

The most sane version to use is GNU emacs, although both GNU emacs and Xemacs are installed on the Andrew UNIX machines. There's a ton of good documentation for how to use it available on the web, some of which is linked here.

You can control large swaths of emacs settings---such has indentation style, compiler hooks, and syntax highlighting---by setting its mode. There is an excellent mode specifically for editing SML. It's documentation can be found here.

Vi iMproved (vim)

The guiding principle of vim philosophy is that your text editor should do exactly that: edit text. It differs from emacs in that it makes much more extensive use of modes to get things done. You start out in command mode, which interprets keystrokes as commands, and can switch back and forth between it, insert mode (which actually enters text), and visual mode (which lets you select and modify large chunks of text). Having modes means that vim does not require a long series of keystrokes for every command.

Most Unix machines probably already have vim installed on them, but if not, odds are there is a vim package of some sort available. Windows users can also install a graphical version of vim to use as a text editor. Again, there is a great deal of documentation for vim available on the internet.

last modified 20:00, 01 Feb 2018
Valid CSS! Valid XHTML 1.0 Strict