Returning a Function

Learn how a function can return another function.

In Elixir, functions are first-class citizens. We can define a function, assign it to a variable, and then use that variable to invoke the function. We can also pass a function as an argument to another function. This is often referred to as anonymous functions or lambdas in other programming languages.

An Elixir function can also return a function. Let’s elaborate on it through an example.

Here’s the code:

iex> fun1 = fn -> fn -> "Hello" end end 
#Function<12.17052888 in :erl_eval.expr/5> 
iex> fun1.()
#Function<12.17052888 in :erl_eval.expr/5> 
iex> fun1.().()
"Hello"

The first line is hard to read, so let’s spread it out.

fun1 = fn ->
          fn ->
             "Hello"
          end 
       end

The variable fun1 is bound to a function. That function takes no parameters, and its body is a second function definition. That second function also takes no parameters, and it evaluates the string "Hello". When we call the outer function using fun1.(), it returns the inner function.

When we call (fun1.().()), the inner function is evaluated and Hello is returned.

Get hands-on with 1200+ tech skills courses.