| Introduction. Programming Paradigms. Basic concepts of programming in Haskell, Elm: functions, identifiers, recursion.
| Basic concepts: recursion, constants, primitive data types, tuples, infix operators, evaluation.
| Basic concepts: local declarations, data types, polymorphism.
| Lists: list construction, basic operations on lists.
| Lists: list operators (generators, guards, list comprehensions).
| Trees: alternative data, pattern matching, exceptions, binary trees, list-tree conversions.
| Trees: binary search trees, checking AVL balance property for trees, printing.
| Implementing operations on sets. Propositional reasoner
| Higher-order functions: anonymous functions, partial application, relations functions – data, combinator functions
| Higher-order functions for lists (map, filter, fold).
| Infinite data: lazy evaluation, unbounded objects, circular structures.
| Lambda calculus: Lambda notation, conversions, combinators.
| Reasoning on program correctness: structural induction, equivalence of functions, induction on the number of nodes.
| Monads. Example of use cases.