MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: Pure Functions in rules
  • Next by Date: Re: Linear algebra
  • Previous by thread: Re: Pure Functions in rules
  • Next by thread: RE: Pure Functions in rules