The Basic Principles of Functional ProgrammingAvoiding Mutable StateFunctions as First-Class ValuesLambdas and ClosuresHigher-Order FunctionsSide-Effect-Free FunctionsRecursionLazy vs. Eager EvaluationDeclarative vs. Imperative ProgrammingDesigning TypesWhat About Nulls?Algebraic Data Types and Abstract Data TypesExercises