Functional programming

Objectives and outcomes

Introducing students to the mathematical foundations of functional programming and the paradigm itself.
Learning to use a purely functional programming language. After completing the course students are familiar with the mathematical background of functional programming, they understand the difference between functional and imperative programming, they are
able to identify the problems suitable for applying functional programming. Furthermore, students are confident in using one purely functional programming language for solving complex programming problems and developing practical software projects.


Functional programming languages. Differences between functional and imperative programming. The
basis of lambda calculus: abstraction, lambda function, function application, free and bound variables.
Reductions in lambda calculus. Normal forms. Evaluation of lambda expression and valid lambda
expressions, natural numbers arithmetic, logical and conditional expressions in lambda calculus.
Recursion in lambda calculus and Y combinator. Applicative and normal order of lambda expression
evaluation. Lazy evaluation. Infinite data structures. Lambda expressions in programming languages.
Solving problems in a “functional” way. Functors, applicative functors and monoids. Monads. Parser

Practical classes

Data structures and syntax of a given functional programming language. Higher order functions and
currying. Solving problems in a given functional programming language. Overview of the built-in
functions and operators in given functional programming languages. Programming assignments on
functors, applicative functors, monoids and monads. Using a parser combinator library on an illustrative
example of text parsing.