Bookmark and Share

This is a note on the syntax and logic of Mathematica functions Apply, Map, MapThrough, MapAll, etc.

Apply and infixes @, @@, and @@@

f@expr is the infix format of f[expr], e.g. f@x is f[x], and f@{x,y,...} is f[{x, y, ...}].

f@@expr the infix format of Apply[f, expr], and is Apply[f, expr, {0}] with the default level specification {0} omitted. Here the {0} specifies that the level-0 subexpression, i.e. expr itself is the target of operation. And the operation is to replace the operand's head with f. Therefore f@@h0[x, y, ...] is Apply[f, h0[x,y,...], {0}] and evaluates to f[x,y, ...] after replacing the level-0 expression's head h0 by f.

f@@@expr is the infix format of Apply[f, expr, {1}], which means to replace the level-1 subexpressions' heads by f, e.g. f@@@h0[h1[x1, x2, ...], h2[y], z, ...] is Apply[f, h0[h11[x1, x2, ...], h12[y], z, ..., {1}] and evaluates to h0[f[x1, x2, ...], f[y], z, ...] after replacing h11 and h12 by f. Note z doesn't have a head h13 on it and doesn't change.

In[1]:= f@@@h0[h1[x1,x2],h2[y],z] 
Out[1]= h0[f[x1,x2],f[y],z] 

The level refers to the different substructures of an expression that can be accessed using Part with the level specification

In[2]:= expr={{x1,x2},y};
Part[expr,0]
Part[expr,1]
Part[expr,2]

Part[expr,{1,0}]
Part[expr,{1,1}]
Part[expr,{1,2}]

Part[expr,{2,0}]
Out[2]= List
Out[3]= {x1,x2}
Out[4]= y
Out[5]= {{x1,x2},List}
Out[6]= {{x1,x2},{x1,x2}}
Out[8]= {{x1,x2},y}
Out[9]= {y,List}

Map and infix /@, MapAll and infix //@

f /@ expr assigns f to each level-1 part of expression and Apply it, e.g.

In[9]:= f/@h0[x,y,z] 
Out[9]= h0[f[x],f[y],f[z]] 

f //@ expr assigns f to each part of expression at all levels and Apply it, e.g.

In[10]:= f//@{{x1,x2},y,z} 
Out[10]= f[{f[{f[x1],f[x2]}],f[y],f[z]}]
blog comments powered by Disqus