Re: Pure Functions in rules
- To: mathgroup at smc.vnet.net
- Subject: [mg15965] Re: Pure Functions in rules
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Fri, 19 Feb 1999 03:26:53 -0500
- References: <7ag34l$aie@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Will Self wrote in message <7ag34l$aie at smc.vnet.net>... >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 > Will. In[80 evaluates thus: {1,2,3}/.(m_List->(2*#& /@ m)) (*right side of -> evauates before replacement*) {1,2,3}/.(m_List->(m)) {1,2,3} Using :> instead of -> gives {1,2,3}/.(m_List-:>(2*#& /@ m)) 2*#& /@ {1,2,3} {2,4,6} You don't get the same sort of problem with >In[79]:= {1,2,3}/.m_List->f[m] because f only evauates on lists. Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565