Duke House Course 59.06 - Programming Languages


Duke's Computer Science Curriculum offers a wide selection of courses in various application areas, such as Bio Informatics, Mobile Applications, Databases, Distributed Systems, etc., and specific fields within Computer Science, such as Algorithms, Information Theory, and Artificial Intelligence. However, despite the breadth of the Curriculum and areas covered, many courses, introductory courses in particular, use Java, C++, and other similar Object Oriented languages exclusively. While this is a great decision to help students build foundations, Object Oriented languages are not the universal solutions to every kind of problem. At the moment, there are no courses on functional programming or other types of languages. This house course is a student lead an attempt to fill this gap.


This class was originally taught in the Spring 2013 semester by Yang Su and Kevin Gao. This semester will be very similar but we will cover fewer languages and study them in greater depth.

Course Overview

Each language has its own set of idioms, its strengths, and its weaknesses. By learning several different programming languages, you will be able to see which language is best suited to the kinds of problems that interest you most. In this course, we will learn about each of the following 5 languages:

  1. Racket
  2. Haskell
  3. Prolog
  4. Ruby
  5. Scala

We will examine each language in the following areas:

  • Typing Model
    Whether the typing of a language is strong (Java) or weak (C), static (Java) or dynamic (Ruby), and how the trade-offs impact a developer in making decisions about how to tackle a particular problem

  • Programming Model
    Whether a language is object-oriented, functional, procedural, or some type of hybrid. The selected languages span 4 different programming models:

    • 1 logic-based programming language (Prolog)
    • 2 with full support for object-oriented concepts (Ruby, Scala)
    • 3 that are functional in nature (Racket, Haskell, Scala)
  • Implementation
    Whether a language is compiled or interpreted, have virtual machines or not, and how these differences affect the forms of interactions with the language and workflows. In this course, we will be mostly use interactive shells or input source files.

  • Core Control and Data Structure
    What a language offers to control of the flow and logic of programs, such as pattern matching in Haskell and Scala, or unification in Prolog, or standard conditionals and loops, etc. And how data are stored and manipulated within a language. For example, collections are very important in every language, yet the way they are used are vastly different.

  • Unique Features
    What differentiates a language from another? High-level constructs such as Racket’s macros or Haskell’s monads, the JVM that Scala runs on, Prolog's ability to use logic to solve constraints, as well as concurrency models such as Scala’s actors, how Haskell programmers leave mutable state behind.

When you're through, you will not be an expert in any of these languages, but you will know what each uniquely has to offer.