O'Reilly logo

Introducing Elixir by J. David Eisenberg, Simon St. Laurent

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Chapter 8. Higher-Order Functions and List Comprehensions

Higher-order functions, functions that accept other functions as arguments, are a key place where Elixir’s power really starts to shine. It’s not that you can’t do higher-order functions in other languages—you can in many—but rather that Elixir treats higher-order functions as a native and natural part of the language rather than an oddity.

Simple Higher-Order Functions

Way back in Chapter 2, you saw how to use a fn to create a function:

iex(1)> fall_velocity = fn(distance) -> :math.sqrt(2 * 9.8 * distance) end
#Function<6.106461118/1 in :erl_eval.expr/5>
iex(2)> fall_velocity.(20)
19.79898987322333
iex(3)> fall_velocity.(200)
62.609903369994115

Elixir not only lets you put functions into variables, it lets you pass functions as arguments. This means that you can create functions whose behavior you modify at the time you call them, in much more intricate ways than is normally possible with parameters. A very simple function that takes another function as an argument might look like Example 8-1, which you can find in ch08/ex1-hof.

Example 8-1. An extremely simple higher-order function
defmodule Hof do
  def tripler(value, function) do
    3 * function.(value)
  end
end

The argument names are generic, but fit. tripler/2 will take a value and a function as arguments. It runs the value through the function and multiplies that result by three. In the shell, this might look like the following:

iex(1)> my_function = fn(value) -> 20 ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required