Re: Through[(a+b+b)[x]]

*To*: mathgroup at smc.vnet.net*Subject*: [mg109198] Re: Through[(a+b+b)[x]]*From*: Leonid Shifrin <lshifr at gmail.com>*Date*: Fri, 16 Apr 2010 05:53:19 -0400 (EDT)

Hi Derek, I think that neither is Through a right tool for the job here, nor do you have a well-formulated problem. I don't quite see though why you don't like the pattern-matching - based approach - pattern-matching is a tool created specifically to deal with such problems. Here is how I would start with a problem like yours: ClearAll[fPlus, fTimes]; SetAttributes[fPlus, {Orderless, Flat, OneIdentity}]; SetAttributes[fTimes, {Orderless, Flat, OneIdentity}]; fPlus[left___, a_?NumericQ, right___][args___] := a + fPlus[left, right][args]; fPlus[funs___][args___] := Total[#[args] & /@ {funs}]; fTimes[left___, a_?NumericQ, right___][args___] := a*fTimes[left, right][args]; fTimes[funs___][args___] := Times @@ Map[#[args] &, {funs}]; ClearAll[fCompute]; SetAttributes[fCompute, HoldAll]; fCompute[expr_[ args___]] := (Unevaluated[expr] /. {Plus -> fPlus, Times -> fTimes})[args] This approach is based on defining summation and multiplication operations for functions, and can be easily extended to other operations. Here is how it can be used: In[57]:= fCompute[(a + b*c + 3 b)[x]] Out[57]= a[x] + 3 b[x] + b[x] c[x] In[58]:= fCompute[(a + b)[x]] Out[58]= a[x] + b[x] In[59]:= fCompute[((a + b)*(c + 3 d))[x]] Out[59]= (a[x] + b[x]) (c[x] + 3 d[x]) In[60]:= fCompute[(a + b + 3)[x]] Out[60]= 3 + a[x] + b[x] Hope this helps. Regards, Leonid On Thu, Apr 15, 2010 at 7:13 AM, Derek Yates <yatesd at mac.com> wrote: > Through[(a+b)[x]] yields a[x]+b[x] as expected, but Through[(a+b+b) > [x]] yields a[x]+(2b)[x]. Through[(2b)[x]] yields 2[x]b[x]. Now, I can > obviously get around this in this specific case, but generically is > there a way to solve this so that Through[(a+b+b)[x]] yields a[x] > +2b[x]? The case where I envisage this happening is when a sum of > functions is supplied (say, for a given value of y, Through[(f[y]+g[y] > +h[y]+j[y])[x]] and for some values of y, g = h. Then one will end up > with the problem above. Other than some post processing using pattern > matching, which feels a bit clunky, I can't think of a way around this. > >