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]}]