Scala Tutorials Part #27 - Higher Order Functions
Originally Posted On : 10 Nov 2017
Higher Order Functions
This is part 27 of the Scala tutorial series. Check here for the full series.
Index
Introduction
In part 19, we saw how functions are treated as first class citizens in Scala. In this article we are going to take a look at higher order functions. Higher order functions are functions which are,
- Functions that takes another Function as a parameter
- Functions that returns another Function
Example with collections
First we will define a List
with some values.
Next, lets define a function that doubles each value that is given to it.
The List
class has something called a map
function which takes in other function and produces a new List
. We are going to feed our doubleValue
function to it.
This gives us a list with values (100, 121, 144, 169)
. The map
function is a classic example of a higher order function. We can also give it an
anonymous function in case we do not want to define a function explicitly.
Creating a custom higher order function
In order to fully understand Higher Order functions, its best that we learn to create one ourselves. Let’s create a function that applies a pattern to a given string.
This is an example of a function that takes another function as a parameter. f
is a variable which is of type function and one which takes in a
String and gives out another String
. Next, we will create a function which given a string appends a <title>
tag to it and which can be passed
into the HTMLStringDecorator
function.
Unlike HTMLStringDecorator
this returns a function itself. We can then call the decorator with the title tag appender function.
This might seem simple, but using such patterns we can build powerful DSL based syntax and languages. Higher order functions are just one piece of the puzzle, we still have partially applied functions, closures, currying etc., which can help build systems that make complex patterns much simpler to work with.
Closing notes
We saw a very basic overview of higher order functions. At this point this knowledge should be enough to move forward. But we must remember that with such power comes responsibility and not everything must be dealt with a DSL/Higher order functions. Design and best practices is a completely different area which we will explore in later tutorials.