Functions Can Return Functions

Here’s some strange 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 strange thing is the first line. It’s a little 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 that (fun1.().()) the inner function is evaluated and “Hello” ...

Get Programming Elixir now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.