Academic year
2022/2023 Syllabus of previous years
Official course title
Course code
CM0632 (AF:398284 AR:214952)
On campus classes
ECTS credits
Degree level
Master's Degree Programme (DM270)
Educational sector code
1st Semester
Course year
Go to Moodle page
An in-depth analysis of the advanced concepts and techniques of modern programming languages together with an introduction to the foundational tools from programming language theory and type theoretic frameworks available to reason about and asses their design.

We will look at the principles underpinning the functional, object-oriented and concurrent paradigms and analyze their practice and implementation in mainstream programming languages. Most of the development will focus on Scala, but we will draw also from other statically typed languages such as ML, Java (and Rust?) as well as on dynamically typed languages like python.
To understand the design space of programming languages. This includes concepts and constructs from existing programming languages as well as those that are subject of current investigation and may be used more widely in the future. It also includes an assessment of the trade-offs between language features, expressiveness and implementation costs.

To learn the foundational techniques for reasoning about programs and their correctness.

To understand the programming techniques associated with various language features. The study of programming languages is, in part, the study of conceptual frameworks for problem solving, software construction, and development.
Knowledge of the basic principles of object-oriented languages (such as Java) is assumed.
- Evolution of programming languages design and implementation
- Introduction to functional programming and Scala.

Typing foundations of programming languages
- Applied Lambda Calculus. Syntax and operational semantics
- Typing: types, type systems, type safety (with TALC)

Functional data and function modeling in Scala
- Immutable non-encapsulated data structures in Scala
- Lists and trees: first-order, higher-order and polymorphic functions

Subtyping and subtype polymorphism
- The substitution principle and the subtype relation
- Typing and Subtyping: nominal vs structural

Object-Oriented data modeling (in Scala)
- Encapsulated data types: Scala’s traits, classes, and hierarchy of types,

Type parametrization
- Generics, variance and type bounds
- Collections

Ad hoc polymorphism
- From overloading to constrained parametric polymorphism (with F-bounded polymorphism)
- Qualified types and type classes

Strict vs Non-strict evaluation
- Evaluations strategies: foundations and implementation consequences
- Lazy evaluation at work: thunks, lazy lists and infinite data structures

Error handling
- Exceptions: strengths, weaknesses and alternatives.
- Options and Try computations in Scala

Monads and monadic programming
- Conceptual framework
- Applications: State, IO

Parallel & Concurrent computation
- Models of parallel and concurrent computation: from shared memory to actors.
- Concurrent and asynchronous computations with Futures

[Scala] Programming in Scala (5th Edition). M. Odersky, L. Spoon, B. Venners, F. Sommers.
Artima Press. 2021.

[FP-Scala] Functional Programming in Scala. P. Chiusano, R. Bjarnason. Manning Press. 2015
Source code available at:

[TAPL] Types and Programming Languages. B.C. Pierce. The MIT Press. 2002.
A written test will assess the basic understanding of the material covered in class.
An oral discussion will then follow, focused on an in depth analysis of a topic agreed upon with each student (or student group)
Class lectures with in-class exercises, and additional exercises proposed as homework.
written and oral

This subject deals with topics related to the macro-area "Circular economy, innovation, work" and contributes to the achievement of one or more goals of U. N. Agenda for Sustainable Development

Definitive programme.
Last update of the programme: 15/09/2022