Re: composing functions
- To: mathgroup at smc.vnet.net
- Subject: [mg45542] Re: [mg45527] composing functions
- From: "Sseziwa Mukasa,,(978) 536-2359" <mukasa at jeol.com>
- Date: Tue, 13 Jan 2004 04:03:56 -0500 (EST)
- References: <200401120715.CAA29367@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Jan 12, 2004, at 2:15 AM, Pedro L wrote:
> Hi!
>
> I would like to find a way for composing a list of functions over a
> list of numbers.
>
> I have the list {{f, g, h}, {a, b, c, d}}
> (f, g, h are functions and a, b, c, d are numbers)
> I would like to obtain h[g[f[a, b], c], d]
>
> [deleted]
>
> Could you help me?
>
As usual there are multiple approaches, you may want to consider the
Composition function. Here's my approach using Fold.
Placing the elements of the second part of the list in the appropriate
place is trivial:
1) Fold[List,a,{b,c,d}]
results in
{{{a, b}, c}, d}
2) Apply can be used to put the correct head at the correct level, for
example:
Apply[f,Fold[List,a,{b,c,d}],{2}]
results in
{{f[a, b], c}, d}
3) Using the result from 2 and Fold again we can write
Fold[Apply[#2[[1]], #1, {#2[[2]]}] &, Fold[List,
a, {b, c, d}], {{h, 0}, {g, 1}, {f, 2}}]
to get
h[g[f[a, b], c], d]
where we annotate the function heads with the level we want to apply
them at.
To make the general case, for input in the form of a nested list of two
levels, the first of which is the list of heads of functions and the
second is the list of arguments:
compose[{{heads__}, {args__}}] := With[{
lst = {heads}}, Fold[Apply[#2[[1]], #1, {#2[[2]]}] &, Fold[List,
First[
Unevaluated[args]], Rest[{args}]], Transpose[{lst,
Range[Length[lst] -
1, 0, -1]}]]] /;
Length[Unevaluated[heads]] == Length[Unevaluated[args]] - 1
which results in
In[57]:=
compose[{{f,g,h},{a,b,c,d}}]
Out[57]=
h[g[f[a,b],c],d]
I took the liberty of doing some argument checking, and using sequence
objects. I'm not sure if using the sequence objects results in an
optimal expression or not, but unless your level of nesting is high it
shouldn't matter.
Regards,
Ssezi
- References:
- composing functions
- From: Pedro L <pedrito6@softhome.net>
- composing functions