Re: Pure Functions in rules
- To: mathgroup at smc.vnet.net
- Subject: [mg15962] Re: Pure Functions in rules
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Fri, 19 Feb 1999 03:26:52 -0500
- Organization: Universitaet Leipzig
- References: <7ag34l$aie@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi Will,
the behaviour is correct because you have to use
RuleDelayed[] and
{1,2,3}/.m_List:>(2*#& /@ m)
works as expected. You can see what's happen with
Trace[{1,2,3}/.m_List->((2*#)& /@ m)]
The rhs of Rule[] is evaluated first and gives the final
replacement m_List -> m, because the pure function maps
to a symbol.
If you have a function f[m_List] defined just the same happens
(m_List -> f[m]) but since m is not a list Mathematica leaves
the result unevaluated until ReplaceAll[] insert the list
in the argument of f[]. Now the pattern for f[m_List] matches
and f[] can multiply the list entries by two.
It is a good rule for the design of replacment rules
to use RuleDelayed[] when in the left hand side of the
rule contain a pattern.
Hope that helps
Jens
Will Self wrote:
>
> It appears that I cannot depend on using a pure function
> in a pattern-matching rule.
>
> Here I am trying to convince reluctant students that they're
> better off learning to use Mathematica than doing things
> by hand, and we run across something like this, and in a
> much more complicated situation where the trouble was
> hard to isolate.
>
> I am quite frankly incensed by the behavior shown in
> In/Out 80, below. Look at these examples:
--- snip snap - snip snapp - snip snap ---
>
> In[79]:= {1,2,3}/.m_List->f[m]
> Out[79]= {2,4,6}
>
> Now try this:
>
> In[80]:= {1,2,3}/.(m_List->(2*#& /@ m))
> Out[80]= {1,2,3}
>
> Does anyone (say, at WRI for example) care to comment on
> this?
>
> Will Self