I have an expression consisting of a few pure functions added together like so:
f+g+h
I want to add the bodies of these functions together and make that a pure function. Usually I would do this by finding the maximum number of arguments (maxArgs) required to fill the functions f, g and h, and then create my added function like so:
newFunc = Evaluate[Through[(f+g+h)@@Slot/@Range@maxArgs]] &;
The Evaluate here is important for a couple of reasons impertinent to this question. Just know that it is necessary to evaluate the function body.
The problem with this method is that in general, I won't always know what maxArgs will be. Technically, I could find this value by using this answer, but I'm worried about the performance and robustness of this method.
I thought that I might circumvent the need to specify a number of slots by doing this:
newFunc = Evaluate[Through[(f+g+h)[##]]]&
But Mathematica's output at this point throws an error, saying that the slots of the functions f, g and h cannot be filled from ##. I understand that this is because ## appears as just one symbol to Mathematica.
So how might I evaluate Through without specifying the number of slots I will need?
Example:
Given:
f = #&;
g = Function[{a,b,c}, a^3 - b];
h = - #1^2 + #2 &;
My desired output is produced by:
myFunc = Evaluate[Through[(f+g+h)[#1,#2,#3]]&;
The important bit here is the Evaluate. I want to evaluate the function body completely before creating the function. The problem with the code above is that I had to explicitly enter the maximum number of slots required by the pure functions. In this case, three slots were required. In general, I may be using functions that take 3 arguments, or 5, or 72, etc.
In my notebook, I will not know ahead of time how many slots will be used by these functions.
exprto end up with five slots.fwould take its fill from the first 3, g from the first 2, and h from all of them. In other words, I would want the equivalent ofexpr = Through[(f+g+h)[#1,#2,#3,#4,#5]]. – Myridium Jul 11 '15 at 13:30Derivativein your examples. Is this the only other expression that yo wish to treat like a function or are you going to add another one as soon as answers are updated to handleDerivative? Also# & + Derivative[1]andDerivative[1] + # &are surely different as the first one is(# &) + Derivative[1]whereas the second is(Derivative[1] + #) &. I think your question is not well specified at present as it is not clear what extent of heads you expect to be handled. I am going to put this on hold until you can provide an exhaustive specification. – Mr.Wizard Jul 13 '15 at 01:49Through[(Derivative[1] + (# &))[#1]]... think about it... – ciao Jul 13 '15 at 03:06ArcTan, a function that has both one and two parameter forms. You must explain how such problems are to be handled if this question is to be answerable. (continued) – Mr.Wizard Jul 13 '15 at 05:58