I have come across a simple example of bizarre behaviour, i.e.:
Function[t, t*c] /. c -> 0
which outputs
Function[t, t 0]
How can I make the product "t 0" evaluate to 0?
Function has the attribute HoldAll
:
Attributes[Function]
{HoldAll, Protected}
This explains the behavior you're seeing. There are many ways to handle this. One that I like is to use Inactivate
/Activate
:
expr = Function[t, t*c] /. c -> 0;
Activate @ Inactivate[Evaluate @ expr, Function]
Function[t, 0]
With Inactivate
, you can control which parts of expr get inactivated, i.e., you can do partial evaluations. As a silly example, suppose you have:
expr = Function[t, 0/0 + 1 + 2]
Function[t, 0/0 + 1 + 2]
You can avoid evaluating 0/0 as follows:
Activate @ Inactivate[Evaluate @ expr, Function | Times | Power]
Function[t, 3 + 0/0]
While Carl Woll's answer is probably better in general, here I would just use the more terse MapAt
:
expr = Function[t, t*c] /. c -> 0;
MapAt[ Evaluate, expr, 2 ]
Function[t, 0]
Note that the operator form makes this particularly convenient to use:
Function[t, t*c] /. c -> 0 // MapAt[Evaluate, 2]
Function[t, 0]