It is my practice to place Condition
expressions on the left side of :=
and :>
in almost every case.
I find this to be more logical as it is part of the pattern
With the exception of use inside
Module
,Block
, orWith
on the RHS, which is a special case, the Condition depends only on the LHS, and therefore IMHO is more logically placed on the LHSIts behavior remains consistent when used with
=
and->
f[x_] /; x < 5 := 1
andg[x_] /; x < 5 = 1
behave similarlyf[x_] := 1 /; x < 5
andg[x_] = 1 /; x < 5
behave differently
The evaluation path is significantly less complicated
Placing the condition on the RHS requires the internal use of
RuleCondition
and$ConditionHold
which can significantly slow down simple functions.Clear[f, g] f[x_] /; OddQ[x] := 1 f[x_] := 0; g[x_] := 1 /; OddQ[x] g[x_] := 0; f[4] //Trace
{f[4], {OddQ[4], False}, 0}
g[4] //Trace
{g[4],{{OddQ[4],False},RuleCondition[$ConditionHold[$ConditionHold[1]],False],Fail},0}
a = Range@1*^6; Timing[f /@ a;] Timing[g /@ a;]
{0.421, Null} {0.655, Null}
Nevertheless, the documentation for Condition
shows the RHS form and many experienced users also seem to favor this form.
Which form should be standard, and why?
A brief edit: The form f[x_ /; x < 5] := 1
is what I use most often as should be clear to those who read my answers on StackOverflow. I omitted this form specifically because I didn't want to spawn a discussion (bad for SE sites) about purely-stylistic differences. I see now that this may have had the opposite effect. Rather I wish to focus this question on the apparently canonical yet IMHO inferior RHS placement and what its merits are.