CSCI 2041 - Advanced Programming Principles Credits: 4 Hours/Week: Lecture 4 Course Description: This course covers the principles and techniques for creating correct, robust, modular programs. Topics include computing with symbolic data, recursion/induction, functional programming, impact of evaluation strategies and parallelism. Additional topics include organizing data/computations around types, search-based programming, concurrency and modularity. Prerequisite(s): CSCI 1082 - Object-Oriented Programming and CSCI 2014 - Discrete Structures of Computer Science with grades of C or higher. Major Content
- Introduction to functional programming: primitive types and operators, let bindings, lambda expressions, recursion
- Conditional expressions, pattern matching, iteration and recursion, tuples and lists
- User-defined data types, product and sum types, inductive types
- Higher-order functions, currying, closures, polymorphism
- List-processing functions: map, filter, fold, reduce; relationship between functions
- Program representation and evaluation.
- Type checking and type inference.
- Evaluation strategies: call-by-name, call-by-value, lazy evaluation
- Evaluation control: exceptions, continuations, delayed evaluation
- Evaluation of program correctness using natural and structural induction”
- Types and imperative programming: side effects, references, mutable data structures, and algorithms
- Modularity and data abstraction mechanisms
- Optional topics: search, program representation, concurrency, proof techniques
Learning Outcomes At the end of this course, students will be able to:
- write, and debug simple functional programs for recursive computations on lists, trees, strings, and numeric types.
- use inductive, polymorphic, and hierarchical abstract data types to organize program data and efficiently solve computational problems.
- explain the benefits and limitations of type systems, as well as the common program errors that can be eliminated using strong type systems.
- explain how manipulating functions as values and the use of higher-order functions can be used to solve appropriate algorithmic problems.
- explain how common list-processing functions (such as map, fold, reduce, and filter) are used and implemented in order to be the best for a given algorithmic task.”
- explain the impact of different approaches to program evaluation and methods to manipulate the order of evaluation in programs, such as continuations, exceptions, tail recursion, and streams.
- explain and differentiate program organization and reuse mechanisms such as polymorphism, modules, namespaces, private internals, classes, and nesting.
Courses and Registration
Add to Portfolio (opens a new window)
|