Successful course participants will:
Internalize an accurate understanding of what functional programs mean
Develop the skills necessary to learn new programming languages quickly
Master many specific language concepts such that they can recognize them in strange guises
Learn to evaluate the power and elegance of programming languages and their constructs
Attain reasonable proficiency in the OCaml language — and, as a by-product, become more proficient in languages they already know
The course assumes knowledge of the Java programming language at the level covered in CSE 123. However, students will not program in Java in this course. Instead, Java mainly will be used as a point of comparison for the language that is used (OCaml).
Syntax vs. semantics vs. idioms vs. libraries vs. tools
OCaml basics (bindings, conditionals, records, functions)
Recursive functions and recursive types
Benefits of no mutation
Algebraic datatypes, pattern matching
Tail recursion
Higher-order functions; closures
Lexical scope
Currying
Syntactic sugar
Equivalence and effects
Laziness, streams, and memoization
Implementing languages, especially higher-order functions
To learn these topics using real programming languages and well-suited for them, we will use OCaml, a statically typed, mostly functional language.
There are thousands of languages not on this list, many programming styles not represented, and many language constructs and concepts that would be great to study, but 10 weeks is short! The languages above will serve as representatives for entire programming styles and paradigms.