Function rank

In SHARP APL, Rationalized APL, and J, function rank refers to a built-in property of a function indicating which argument ranks it accepts. A function will be applied as though it were given that rank with the Rank operator. The function rank may also have other observable effects: in J, the ranks of  may be viewed using   and another function   may be given those ranks using   (  is the Rank operator). Every language with function rank defines "close" composition operators which inherit the rank of their right operand—the derived function produced by such a composition has ranks derived from that function's ranks.

History
Function rank was first introduced without being given a name in SHARP APL, as a feature of the compositions with and over. New compositions such as  were described as "close in the sense that the expression… is applied individually to each subarray argument of  ". The concept of function rank was formalized, and applied to most primitives, when the Rank operator was introduced to SHARP version 19.0 in 1987. In J every function, primitive or user-defined, has a function rank.

Definition and properties
A function with rank applies only to cells of the appropriate rank. In order to operate on those cells it will map over arguments of larger rank as though the Rank operator were applied to it.

As the Rank operator accepts up to three specified ranks in its right argument, a function with a defined function rank has three ranks, one for the argument in the monadic case plus two for the arguments in the dyadic case. These ranks may be infinite, or larger than the maximum rank if there is one, in which case they have no effect on the function's application.

A function's rank is obtained from its definition: It is not possible to modify the ranks of a function. Instead, apply the Rank operator to create a new function which has the given rank, but functions like the left operand on arrays of that rank. Notably, given a function is defined with a particular rank, it is impossible to make it work on arrays of a higher rank. Applying Rank with larger numbers will produce a function whose rank is higher, but the function's results will be no different: the inner function will still map over cells because it retains its rank.
 * Ranks of primitive functions are defined by the interpreter.
 * The ranks of a derived function are determined by its operands. For most operators they are infinite; for close compositions they are obtained from the right argument, and for functions derived from the Rank operator they are obtained from the right operand.
 * The ranks of a user-defined function are infinite.