Functional programming represents one of the traditional programming paradigms. Traditional and novel functional programming
languages are on the rise nowadays and the functional paradigm becomes an important construct of traditionally imperative
languages (C++, C#, Java). As such, mastering this paradigm becomes a necessary competence of a software engineer: the theory
and especially the practice.

Requirements:

Syllabus of lectures:

1. Introduction to the subject and functional programming and tools

2. Functions and data types basics

3. Branching and structuring of code

4. Other important data types; dealing with errors; lazy evaluation

5. More advanced constructs of functions and operators

6. Type classes 1

7. Type classes 2

8. Type classes 3

9. Documentation and testing

10. Web frameworks

11. GUI applications

12. Discussion and consultations.

Syllabus of tutorials:

1. Introduction to the subject and functional programming and tools

2. Functions and data types basics

3. Branching and structuring of code

4. Other important data types; dealing with errors; lazy evaluation

5. More advanced constructs of functions and operators

6. Type classes 1

7. Type classes 2

8. Type classes 3

9. Documentation and testing

10. Web frameworks

11. GUI applications

12. Discussion and consultations.

Study Objective:

We demonstrate the concepts using the pure functional language Haskell, however students will be able to apply the knowledge
in other languages, as well; an overview of contemporary functional languages and their characteristics will be provided.