re: pure function puzzle

*To*: mathgroup at yoda.physics.unc.edu*Subject*: re: pure function puzzle*From*: tgayley (Todd Gayley)*Date*: Tue, 13 Jul 1993 10:15:58 -0500

Martin McClain (wmm at chem.wayne.edu) writes: >Dear MathGroupers: >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? I'm not sure why you want this to be a pure function. If you're willing to name the function f = somecode& then use it by name, as in Composition[..., f, ...], you might as well write f in the usual way: f[{x_,y_}] := Intersection[x, #]& /@ y In a long Composition, it will probably be more readable to give the function a name than to write the code "in-line". However, if you want a pure function, here are a couple ways to do it. First, note that nested pure functions _are_ allowed, for example: (#^2& /@ #)& which is a convoluted way of squaring every element of a list. In your case, though, you need to use the argument to the outer pure function inside the inner one, so a name conflict arises over the # symbol. An easy method to avoid this conflict is to use Function, with a named argument, for one of the pure functions: Function[x, Intersection[x[[1]], #]& /@ x[[2]]] You could also use the following, which avoids the problems with Thread by using Distribute: Apply[Intersection, Distribute[{{#[[1]]},#[[2]]},List], {1}]& I hope this is useful. --Todd