##### 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.

##### Lectures

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

combinators.

##### 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.