How do I make this work intuitively?
f[x_] := x^2 /; a>0
f[2] /. a->1
I want the answer to be 4 because 1>0 is True, but it does not work. It works if I make a_ an argument of f, but I don’t want to for various reasons.
How do I make this work intuitively?
f[x_] := x^2 /; a>0
f[2] /. a->1
I want the answer to be 4 because 1>0 is True, but it does not work. It works if I make a_ an argument of f, but I don’t want to for various reasons.
This works, but it is awkward:
g[x_,a_]:=x^2 /; a>0
h[x_]:=g[x,a]
h[2]/.a->1
4
The approach you tried doesn’t work because f[2] is evaluated before the replacement rule is applied.
An approach like the following certainly works:
Module[{fResult},
a = 1;
fResult = f[2];
a =.;
fResult
]
But that’s probably too ornate for whatever you are doing given that you don’t want to define an f[x_,a_].
Another approach is to define f as
f[x_] := x^2
and then to execute
If[a > 0, f[2]] /. a -> 1
or
If[a > 0, f[2],alternative] /. a -> 1
I’m sure there are lots of approaches, but which one you might use depends on the particular problem that you are coding.
Here is idiomatically correct version of your code that works:
f[x_] := x^2 /; a > 0
Block[{a = 1}, f[2]]
Block is indeed the correct solution.
Why so complicated? How about simply:
f[x_] := If[a > 0, x^2, "whatever"]
this works exactly as intended:
a=.;
f[2] /. a->1
Yours Henrik
Note that that was one of my suggestions.