' Compose¶
Compose a unary value with another
'[f;ff][x;y;z;…]
Where
fis a unary valueffis a value rank ≥1
the derived function '[f;ff] has the rank of ff and returns f ff[x;y;z;…].
q)ff:{[w;x;y;z]w+x+y+z}
q)f:{2*x}
q)d:('[f;ff]) / Use noun syntax to assign a composition
q)d[1;2;3;4] / f ff[1;2;3;4]
20
q)'[f;ff][1;2;3;4]
20
Extend Compose with Over / or over to compose a list of functions.
Use
'[;]to resolve the overloads on'- noun syntax to pass the composition as an argument to
over
q)g:10*
q)dd:('[;]) over (g;f;ff)
q)dd[1;2;3;4]
200
q)(('[;])over (g;f;ff))[1;2;3;4]
200
q)'[;]/[(g;f;ff)][1;2;3;4]
200
Implicit composition¶
Compose one or more unary values with a higher-rank value
Values can be composed by juxtaposition within parentheses.
The general form is a sequence of unaries f, g, h… terminating with a value ff of rank ≥2. The rank of (f g h… ff) is the rank of ff.
q)x:-100 2 3 4 -100 6 7 8 9 -100
q)(x;0 (0|+)\x)
-100 2 3 4 -100 6 7 8 9 -100
0 2 5 9 0 6 13 21 30 0
Above, (0|+) composes the unary projection 0| with Add. The composition becomes the argument to Scan, which derives the ambivalent function (0|+)\, which is then applied infix to 0 and x to return cumulative sums.
If we take -100 to flag parts of x, the expression max 0 (0|+)\x returns the largest of the sums of the parts.
To compose a sequence of unary values, use Apply or Apply At.