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.
expr
to end up with five slots.f
would 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]]
. $\endgroup$ArcTan
, 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) $\endgroup$