About This Course

Get an overview of the content of this course and who this course is designed for.

We'll cover the following

Course description

Welcome to the “Mastering Functional Programming with OCaml and Haskell” course!

Functional programming is a powerful and elegant programming paradigm. Initially only popular among university researchers, it’s gained much traction in the software industry in the last few years. From big companies to start-ups, engineers and managers have realized that functional programming excels at abstraction and composition. Functional programming allows for highly concise solutions with increased safety. This has led to rising demand for software engineers with functional programming skills. This course will help you move your programming skills to the next level.

There are tons of programming languages, frameworks, and tools out there—with many more coming in the future. The only way to stay ahead of the game in this vast and quickly changing software industry is to master the fundamentals and principles that cut across programming languages, frameworks, and tools. In the case of functional programming, learning to adopt the functional way of solving problems is much more productive than memorizing how to write functional code in a particular language. This course teaches this functional way of thinking. We’ll also learn many fundamental techniques from programming languages, such as parsing, compilation, and type checking.

A technique or tool is not very useful if it does not help us solve real-world problems and make our lives easier. In this course, we’ll only look at examples and exercises that are typically encountered in a programmer’s day-to-day job. Furthermore, an entire chapter is dedicated to applying what we’ve learned to real-world scenarios. In particular, we’ll use functional programming to process collections of data for an e-commerce application and handle the JSON datatype.

Think of the duality of striving to grasp the fundamental principles of the functional paradigm while applying it to real-world problems pragmatically as the yin and yang of the journey to master functional programming.

Here is the summary of the chapters in this course:

  • In Chapter 1: Introduction, we’ll start the course with an introduction to functional programming. In particular, we’ll see how it can overcome some of the inherent weaknesses of the imperative programming paradigm. We’ll also discuss why functional programming matters to any software engineer.

  • In Chapter 2: Expressions—The Building Blocks of Functional Programs, we examine expressions and how to build complex expressions from simpler ones. Three aspects of expressions—syntax, types, and semantics—will be covered. Along the way, we’ll gain a much deeper understanding of how programming languages work, including parsing, type checking, interpretation, and compilation.

  • In Chapter 3: Building Abstractions with Functions, we’ll get to know lambda calculus—a mathematical model serving as the foundation of all functional programming languages. We’ll learn how to capture computation patterns as functions. Finally, we’ll discuss various techniques for working with functions such as currying, recursion, and higher-order functions.

  • In Chapter 4: Complex Data Types, we’ll focus on the complex data types typically found in functional programming languages, such as tuples and lists. Furthermore, we’ll use algebraic data types to represent hierarchical data, and pattern matching to extract data from complex data types.

  • In Chapter 5: Common Computation Patterns, we’ll dive into some of the most common computation patterns, such as map, filter, fold, and zip. These functions capture highly general computation patterns on lists and other data structures that can be reused to formulate many other functions.

  • In Chapter 6: Dataflow Programming with Functions, We’ll go over dataflow programming, a programming paradigm that emphasizes composing programs from existing components. We’ll learn how functional programming allows us to do dataflow programming elegantly and reap all its benefits.

  • In Chapter 7: Applying Functional Programming to Various Domains, we’ll apply what we’ve learned to process collections of data commonly found in mobile and web applications, as well as back-end services. Furthermore, we’ll use functional programming to represent and handle JSON.

We’ll mainly use OCaml and occasionally Haskel to demonstrate the key concepts and techniques of functional programming throughout the course. To contrast functional programming concepts with imperative ones, we’ll use Java. Yet, it is essential to repeat that most functional programming techniques introduced in this course are universal. That means we can apply them to almost any programming language that supports the functional programming style. This includes but is not limited to Swift, Kotlin, JavaScript, Go, Python, and even Java (using the Java Stream API).

Intended audience

This is a beginner and intermediate course aimed at software engineers, engineering managers, or computer science students interested in understanding the essence of functional programming. It is also an excellent fit for individuals who are currently preparing for coding interviews and want to improve their problem-solving skills.