I get confused in the order of operations in Mathematica
. For example,
f /@ 10^{1, 2, 3}
{10, 100, 1000}
In my head, that should be
{f[10], f[100], f[1000]}
After using FullForm
, I see that my command should be regarded as : (f /@ 10)^{1, 2, 3}
. In fact, ()
is not often used in Mathematica code, and I'm always not sure about the order of the expression evaluation. And I can't find the information about this order.
For example, in C: http://en.wikipedia.org/wiki/Order_of_operations
On MathWorld, it is just the basic : http://mathworld.wolfram.com/Precedence.html
Parenthesization,
Factorial,
Exponentiation,
Multiplication and division,
Addition and subtraction.
Another example: let look at the order of this:
x + x /. x -> y
2 y
x + (x /. x -> y)
x + y
And it takes time to understand this:
x + y /. x -> 1 + y + x /. x -> 5
6 + 2 y
Without the order of operations, one can get confused by interpret this expression, and of course, we can use ().
((x + y) /. x -> 1) +(( y + x) /. x -> 5)
x + y /. x -> (1 + y + x) /. x -> 5
Another example, one can get confused:
Cases[{1, 2, 3}, _?#1 < 2 &]
or
Cases[{1, 2, 3}, _?(#1 < 2) &]
or
Cases[{1, 2, 3}, _?(#1 < 2 &)]
Another examples, which one &
or /.
is more privileged ?
x /. x -> y + #1 &
x + #1 & /. x -> y
I really appreciate any rule of thumbs or a guide of the operation ordered: /@
, @@
, _?
, /.
, ->
,&
...
Answer
You can check the precedence using Precedence
. So for you first example it works that way because Precedence[Power] < Precedence[Map]
. You have furthermore that Precedence[Function] < Precedence[ReplaceAll]
for one of your later queries.
When you get confused and need to tell what the precedence is the fastest way though is to use FullForm
and Hold
. There are variations of this, I forget which one is considered best practice, but it works like this:
FullForm[Hold[f /@ 10^{1, 2, 3}]]
(* Out: Hold[Power[Map[f,10],List[1,2,3]]] *)
Comments
Post a Comment