Re: Pure Functions in rules
- To: mathgroup at smc.vnet.net
- Subject: [mg15999] Re: [mg15932] Pure Functions in rules
- From: David Withoff <withoff>
- Date: Fri, 19 Feb 1999 03:27:11 -0500
- Sender: owner-wri-mathgroup at wolfram.com
> 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: > > In[73]:= {1,2,3}/.(m_List->7) > Out[73]= 7 > > In[74]:= {1,2,3}/.(m_List->(2*m)) > Out[74]= {2,4,6} > > In[75]:= 2*#& /@ {1,2,3} > Out[75]= {2,4,6} > > In[77]:= f[m_List]:=2*#& /@ m > > In[78]:= f[{1,2,3}] > Out[78]= {2,4,6} > > 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 In this example you don't want (2*#& /@ m) to evaluate until after the value of m has been inserted. There are a number of ways to achieve this, the most common being to use a delayed rule: In[7]:= {1,2,3}/.(m_List :> (2*#& /@ m)) Out[7]= {2, 4, 6} For additional discussion and examples see the documentation for delayed rules and assignments. This behavior is not related to pattern matching or to pure functions. This is an example of controlling order of evaluation. Dave Withoff Wolfram Research