Re: pure function puzzle
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: pure function puzzle
- From: John Lee <lee at math.washington.edu>
- Date: Tue, 13 Jul 93 15:01:32 -0700
Martin McClain <wmm at chem.wayne.edu> writes: > I need a pure function that operates on > {x,{a,b,c}}, > where x, a, b, and c are all simple lists. The output must be > {Ints[x,a],Ints[x,b],Ints[x,c]}, > where Ints means Intersection. You would think this could be based on > Thread, but when a,b,c,and x are all lists, Thread seems to get confused. > Map also has a problem: it needs a function as its argument, and apparently > nested pure functions are not allowed. I can do the required > transformation with a compound statement > f1 = Intersection[x,#]&; > f2 = Map[f1,#]& > and then apply f2 to my input, but x is not known ahead of time. I want > this function as one step in a long Composition, and I really need a clean, > single function of a single argument, producing a single object. Maybe some > clever use of Hold, or Evaluate, or something like that ??? Any ideas? Here's one fairly simple solution: In[38]:= f = Apply[ Intersection, Transpose[{Table[#[[1]], {Length[#[[2]]]}], #[[2]]}], 1 ] &; In[39]:= list = {{1, 3, 5, 7}, {{1, 2, 3}, {3, 4, 5, 6}, {5, 6, 7, 8}}}; In[40]:= f[list] Out[40]= {{1, 3}, {3, 5}, {5, 7}} On the other hand, if you're willing to forego the requirement that f be a pure function, here's a much more straightforward definition: In[46]:= f2[ {x_, y_} ]:= (Intersection[ x, # ]&) /@ y; In[47]:= f2[list] Out[47]= {{1, 3}, {3, 5}, {5, 7}} Jack Lee Dept. of Mathematics University of Washington Seattle, WA