 Understand the lecture slides and discussions thoroughly.
 Revisit the MPs and HWs and make sure you understand the solutions
thoroughly. Repeat any you are not comfortable with.
 Take the sample exam as a dryrun for the actual exam.
The exam will cover the first 10 lectures, up to and including the
lectures of userdefined recursive datatypes . The following give examples of
the kinds of questions you are likely to be asked for each topic:
 Basic OCaml
 Know the basic constructs (e.g., match,
fun, let, let rec) like the back of your hand.
 Be able to evaluate OCaml expressions
 Be able to determine the type of OCaml expressions
 Be able to describe the environment that results from
a sequence of declarations
 Be able to describe the closure that is the result of
evalutating a function declaration
 Understand what effect sequencing, function application and
lambda lifting has on the order of evaluation of expressions
 Recursion
 Be able to write recursive functions, including (but
not limited to) possibly
tailrecursive or possibly forward recursive.
 Be able to recognize whether a function is
tailrecursive, and when a recursive call is in tail call
position
 Understand the performance benefits of tail recursion.
 Higher Order Functions (HOFs)
 Be able to write the definitions of the common HOFs.
 Be able to use map and fold to implement other
functions, as in MP4.
 Be able to write functions that use other functions
as arguments
 Continuations and Continuation Passing Style
 Understand what the basic idea of what a continuation is.
 Be able rewrite an operation / procedure in direct
style to take a continuation to which to pass its results, while
preserving the order of evaluation.
 Be able to put a complex, possibly recursive procedure
into full continutation passing style, while preserving the
order of evaluation.
 Be able to reproduce code for implementing the CPS
transformation, given the mathematical formulation of its cases.
 UserDefined Types
 Be able to define recursive algebraic (variant)
types in OCaml.
 Know the difference between tuples and variant
types, and when each should be used.
 Be able to write OCaml functions over recursive algebraic types.
 Be able to create a recursive algebraic type to model a problem.
