MathGroup Archive 2012

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

Search the Archive

Re: How to use Pick[]; Is this a bug?

  • To: mathgroup at
  • Subject: [mg127810] Re: How to use Pick[]; Is this a bug?
  • From: awnl <awnl at>
  • Date: Thu, 23 Aug 2012 20:50:14 -0400 (EDT)
  • Delivered-to:
  • Delivered-to:
  • Delivered-to:
  • Delivered-to:
  • References: <k14kr3$7ip$>


just a followup to my previous answer to this...

> This same issue comes up anytime you use pattern matching. For
> example consider:
> In[2]:= data = RandomInteger[10, {3, 2}]
> Out[2]= {{9, 2}, {0, 9}, {1, 3}}
> In[3]:= data /. {a_, b_} -> {a - b, a + b}
> Out[3]= {{7, 11}, {-9, 9}, {-2, 4}}
> My pattern looks for a two element list an replaces each two
> element list with the difference and sum of the elements it
> contains. And since the entire expression is a 3 element list
> with each element being a two element list, the entire list is
> not matched and I get the expected result.
> But look what happens if I drop the first element of data using Rest
> In[4]:= Rest[data] /. {a_, b_} -> {a - b, a + b}
> Out[4]= {{-1, 6}, {1, 12}}
> Now the pattern does match the entire list and I get a much
> different result. And like the example with Pick, I can specify
> the pattern as {a_Integer,b_} which will prevent matching the
> entire expression.

that's exactly one of those cases where I consider a "smarter pattern" 
to be rather a workaround than a solution. An explicit level 
specification is very often a much better solution, in this case it will 
allow a solution that also work for reals, symbols or arbitrary expressions:

Replace[Rest[data], {a_, b_} -> {a - b, a + b},{1}]

and also, for example:

Replace[{{0.5, 0.2}, {x, f[y]}}, {a_, b_} -> {a - b, a + b}, {1}]

The point is that I think you should, whenever possible, be able to 
separate the concerns of pattern matching and level specification...



  • Prev by Date: Create new dialog after these computations
  • Next by Date: Re: Non-sequential composition of pure functions
  • Previous by thread: Re: How to use Pick[]; Is this a bug?
  • Next by thread: Re: How to use Pick[]; Is this a bug?