# Chapter 7. Higher-Order Functions and List Comprehensions

Higher-order functions, functions that accept other functions as arguments, are a key place where Erlang’s power really starts to shine. Unlike many languages, Erlang treats higher-order functions as a native and natural part of the language rather than an oddity. List comprehensions apply them in a compact style.

# Simple Higher-Order Functions

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

````1>` `Fall_velocity` `=` `fun``(``Distance``)` `->` `math``:``sqrt``(``2` `*` `9``.``8` `*` `Distance``)` `end``.`
`#Fun<erl_eval.6.111823515>`
`2>` `Fall_velocity``(``20``).`
`19.79898987322333`
`3>` `Fall_velocity``(``200``).`
`62.609903369994115````

Erlang 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 it, in much more intricate ways than are normally possible with parameters. A very simple function that takes another function as an argument might look like Example 7-1, which you can find in ch07/ex1-hof.

##### Example 7-1. An extremely simple higher-order function
````-``module``(``hof``).`
`-``export``([``tripler``/``2``]).`

`tripler``(``Value``,` `Function``)` `->` `3` `*` `Function``(``Value``).````

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:

````1>` `c``(``hof``).`
`{ok,hof}`
`2>` `MyFunction``=``fun``(``Value``)``->``20``*``Value` `end``.`
`#Fun<erl_eval.6.111823515>`
```

Get Introducing Erlang, 2nd Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.