25 | Ways to Apply Functions |

When you write f[x] it means “apply the function f to x”. An alternative way to write the same thing in the Wolfram Language is f@x.

f@x is the same as f[x]:

In[1]:= |

Out[1]= |

In[2]:= |

Out[2]= |

In[3]:= |

Out[3]= |

Apply f “as an afterthought” to x:

In[4]:= |

Out[4]= |

You can have a sequence of “afterthoughts”:

In[5]:= |

Out[5]= |

In[6]:= |

Out[6]= |

Apply numerical evaluation “as an afterthought”:

In[7]:= |

Out[7]= |

In working with the Wolfram Language, a powerful notation that one ends up using all the time is /@, which means “apply to each element”.

Apply f to each element in a list:

In[8]:= |

Out[8]= |

f usually would just get applied to the whole list:

In[9]:= |

Out[9]= |

Display x framed:

In[10]:= |

Out[10]= |

Applying Framed to a list just puts a frame around the whole list.

Apply Framed to a whole list:

In[11]:= |

Out[11]= |

@ does exactly the same thing:

In[12]:= |

Out[12]= |

In[13]:= |

Out[13]= |

The same thing works with any other function. For example, apply the function Hue separately to each number in a list.

In[14]:= |

Out[14]= |

Here’s what the /@ is doing:

In[15]:= |

Out[15]= |

It’s the same story with Range, though now the output is a list of lists.

In[16]:= |

Out[16]= |

Here’s the equivalent, all written out:

In[17]:= |

Out[17]= |

Given a list of lists, /@ is what one needs to do an operation separately to each sublist.

In[18]:= |

Out[18]= |

In[19]:= |

Out[19]= |

Applying Length to the whole list just gives the total number of sublists:

In[20]:= |

Out[20]= |

In[21]:= |

Out[21]= |

Apply Reverse to the whole list, reversing its elements:

In[22]:= |

Out[22]= |

As always, the form with brackets is exactly equivalent:

In[23]:= |

Out[23]= |

In[24]:= |

Out[24]= |

In[25]:= |

Out[25]= |

This makes a single graphic with three objects in it:

In[26]:= |

Out[26]= |

This gives three separate graphics, with Graphics applied to each object:

In[27]:= |

Out[27]= |

When you enter f/@{1,2,3}, the Wolfram Language interprets it as Map[f,{1,2,3}]. f/@x is usually read as “map f over x”.

The internal interpretation of f/@{1, 2, 3}:

In[28]:= |

Out[28]= |

Vocabulary

f@x | equivalent to f[x] | |

x//f | equivalent to f[x] | |

f/@{a,b,c} | apply f separately to each element of the list | |

Map[f,{a,b,c}] | alternative form of /@ | |

Framed[expr] | put a frame around something |

25.7Binarize each flag in Europe, and make an image collage of the result. »

25.8Find a list of the dominant colors in images of the planets, putting the results for each planet in a column. »

25.9Find the total of the letter numbers given by LetterNumber for the letters in the word “wolfram”. »

Q&A

Why not always use f@x instead of f[x]?

f@x is a fine equivalent to f[x], but the equivalent of f[1+1] is f@(1+1), and in that case, f[1+1] is shorter and easier to understand.

It’s determined by the

*precedence*or*binding*of different operators. @ binds tighter than +, so f@1+1 means f[1]+1 not f@(1+1) or f[1+1]. // binds looser than +, so 1/2+1/3//N means (1/2+1/3)//N. In a notebook you can find how things are grouped by repeated clicking.Tech Notes

- Quite a few functions are “listable”, so they automatically map themselves over lists.
- Range is listable, so Range[{3, 4, 5}] is the same as Range/@{3, 4, 5}.

More to Explore